我是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。
预期的Outpout:
<Root xmlns:a="http://myexample.org/a">
<a:Parent xmlns:b="http://myexample.org/b">
<b:Child/>
</a:Parent>
<Root>
我已经成功创建了XSLT来转换数据,但在这里我对名称空间感到困惑。我无法按上述方式生成它。
请帮忙。感谢。
答案 0 :(得分:1)
使用XSLT 1.0在特定位置创建名称空间声明有点尴尬(在<xsl:namespace>
的2.0中它更容易)但是可以通过从复制命名空间节点的技巧来完成stylesheet 文档本身:
<?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
前缀,则无效。