我对XSL完全陌生并且负责使用xmlns生成输出xml:A.B.C前缀/值作为根节点的属性。特别是这样:
<GetVersionResponse xmlns:A.B.C="www.somesite.co.uk/A/B/C">
<Class>GetVersionRequest</Class>
<Errors>
<Error>
<Text>Some message</Text>
</Error>
</Errors>
</GetVersionResponse>
这是我的意见:
<Error>
<Namespace>xmlns:A.B.C</Namespace>
<NamespaceValue>www.somesite.com/A/B/C</NamespaceValue>
<Class>GetVersionRequest</Class>
<Message>Some message</Message>
</Error>
这是Error.xsl文件的重要摘录:
<xsl:template match="Error">
<xsl:variable name="ResponseType">
<xsl:value-of select="concat(substring-before(Class, 'Request'),'Response')"/>
</xsl:variable>
<xsl:variable name="NS">
<xsl:value-of select="Namespace"/>
</xsl:variable>
<xsl:variable name="NSV">
<xsl:value-of select="NamespaceValue"/>
</xsl:variable>
<xsl:element name="{$ResponseType}" namespace="{$NSV}" xml:space="default">
...
</xsl:template
它会生成以下错误,因为我在输入的Namespace元素中有一个冒号:
XSLT 2.0调试错误:未知的名称空间前缀
如果我用下划线替换冒号,我会得到我需要的确切输出,但当然只有下划线。像这样:
<GetVersionResponse xmlns_A.B.C="www.somesite.co.uk/A/B/C">
<Class>GetVersionRequest</Class>
<Errors>
<Error>
<Text>Some message</Text>
</Error>
</Errors>
</GetVersionResponse>
我已经在网上搜了几个小时,并且认为我试图插入xmlns:作为文本,而不是使用将生成xmlns的正确对象:MYTEXT但无法弄清楚如何操作。< / p>
非常感谢您的帮助!!!!
答案 0 :(得分:3)
这里的复杂因素是xmlns:...
名称空间声明属于而不是属性,就XPath数据模型而言,因此您无法使用{{1}创建它们}。但是,在XSLT 2.0中,您可以使用xsl:namespace
创建它们。
xsl:attribute
<xsl:template match="Error">
<xsl:element name="{substring-before(Class, 'Request')}Response">
<xsl:namespace name="{substring-after(Namespace, 'xmlns:')}"
select="NamespaceValue" />
<xsl:copy-of select="Class" />
<Errors>
<Error>
<Text><xsl:value-of select="Message" /></Text>
</Error>
</Errors>
</xsl:element>
</xsl:template>
的{{1}}属性是您要绑定的前缀(因此不包括name
),xsl:namespace
给出了要绑定到的URI。