【问题标题】:how can i add a variable namespace to an element using xslt如何使用 xslt 将变量命名空间添加到元素
【发布时间】:2014-08-06 09:06:22
【问题描述】:

我正在尝试在 soapenv:Header 元素上设置一个命名空间,该元素会根据传递给 xslt 的参数而改变。

这是我正在使用的模板,预期的输出如下。

xslt 的输入是 3 个参数,其中包含一个命名空间、不同的请求方法和消息的正文,它只是被复制的。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="xs"
        version="2.0">
    <xsl:param name="RequestNameSpace" />
    <xsl:param name="RequestMethod"/>
    <xsl:param name="RequestMessageBody" />

    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/" >
        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myns="{$RequestNameSpace}">
            <soapenv:Header/>
            <soapenv:Body>
                <xsl:element name="myns:{$RequestMethod}">
                    <xsl:copy-of select="$RequestMessageBody" />
                </xsl:element>
            </soapenv:Body>
        </soapenv:Envelope>

    </xsl:template>
</xsl:stylesheet>

当前输出,注意在 soapenv:Envelope 标签中没有应用命名空间,我之后是在传入时应用 RequestNameSpace。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myns="{$RequestNameSpace}">
<soapenv:Header/>
<soapenv:Body>
    <myns:hello_world>
       <test_tag>Test output</test_tag>
    </myns:hello_world>
</soapenv:Body>
</soapenv:Envelope>

如果有人能指出我做错了什么,那就太好了。我相信这与我没有使用 xsl: 类型元素作为 soapenv:Envelop 元素的事实有关,但我不确定如何声明它并包含命名空间。

干杯

【问题讨论】:

    标签: xml xslt namespaces


    【解决方案1】:

    你为什么不使用:

    <xsl:element name="{$RequestMethod}" namespace="{$RequestNameSpace}">
        <xsl:copy-of select="$RequestMessageBody" />
    </xsl:element>
    

    【讨论】:

    • 谢谢迈克尔,干杯这是一种享受。就此而言,我对 xslt 和 xml 还很陌生,并且没有意识到将命名空间声明移动到相关节点中也可以。
    【解决方案2】:

    在 XSLT 2.0 中,使用 xsl:namespace 指令,例如 &lt;xsl:namespace name="prefix" select="$requiredNamespace"/&gt;

    如果您被 XSLT 1.0 卡住,您可以使用 &lt;xsl:element name="x:dummy" namespace="{$requiredNamespace}"/&gt; 在所需的命名空间中创建一个虚拟元素(在变量中),然后借助 exslt:node-set() 扩展和命名空间轴,您可以在此结果树片段中找到相关的命名空间节点,并将其复制到所需的元素,例如 &lt;xsl:copy-of select="exslt:node-set($variable)//namespace::x)"/&gt;

    【讨论】:

    • 谢谢迈克尔,这个 xslt 比它看起来要复杂得多,不幸的是,我暂时使用默认的骆驼库,它是 xslt 1.0。为了简单起见,我使用了 michael.hor257k 答案,因为它可以工作并且更易于查看。没有特别的恶作剧。
    • @Mark 请注意,您的样式表声明了 2.0 版(这是您的问题提供的关于您的处理器正在使用的版本的唯一提示......)。
    • 感谢 michael,我今天重新访问时意识到
    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多