XSLT在父节点中指定名称空间

时间:2012-11-27 15:02:14

标签: xml xslt-1.0 transformation xml-namespaces xslt

我是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来转换数据,但在这里我对名称空间感到困惑。我无法按上述方式生成它。

请帮忙。感谢。

1 个答案:

答案 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>

如果您需要样式表中其他位置的ab前缀,则无效。