我是XSLT的初学者。我正在使用它将XML转换为XML。
源 XML:
<Response>
<Text>Hello</Text>
</Response>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://myexample.org/a"
xmlns:b="http://myexample.org/b"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="Response" namespace="http://myexample.org/a">
<xsl:element name="Root">
<xsl:element name="a:Parent">
<xsl:element name="b:Child">
<xsl:value-of select="Text"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出:
<Root>
<a:Parent xmlns:a="http://myexample.org/a">
<b:Child xmlns:b="http://myexample.org/b">Hello</b:Child>
</a:Parent>
</Root>
我想使用 XSLT 将 XML 转换为下面的 XML。
预期出品:
<Root xmlns:a="http://myexample.org/a">
<a:Parent xmlns:b="http://myexample.org/b">
<b:Child/>
</a:Parent>
<Root>
我已经成功创建了 XSLT 来转换数据,但在这里我对命名空间感到困惑。我无法如上所述生成它。
请帮忙。谢谢。
使用 XSLT 1.0 在特定位置创建命名空间声明有点尴尬(在具有 <xsl:namespace>
的 2.0 中要容易得多),但可以通过从样式表文档本身复制命名空间节点的技巧来完成:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://myexample.org/a"
xmlns:b="http://myexample.org/b"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="Response">
<xsl:element name="Root">
<xsl:copy-of select="document('')/*/namespace::a" />
<xsl:element name="a:Parent">
<xsl:copy-of select="document('')/*/namespace::b" />
<xsl:element name="b:Child">
<xsl:value-of select="Text"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
document('')
解析样式表文档并为您提供其根节点,因此document('')/*
是<xsl:stylesheet>
元素。 然后,我们从该元素中提取绑定到指定前缀的命名空间节点,并将其复制到输出文档中。
或者,从<xsl:stylesheet>
中取出命名空间声明并使用文本结果元素:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="Response">
<Root xmlns:a="http://myexample.org/a">
<a:Parent xmlns:b="http://myexample.org/b">
<b:Child>
<xsl:value-of select="Text"/>
</b:Child>
</a:Parent>
</Root>
</xsl:template>
</xsl:stylesheet>
尽管如果您需要样式表中其他地方的a
和b
前缀,这将不起作用。