0

我是 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 来转换数据,但在这里我对命名空间感到困惑。我无法像上面那样生成它。

请帮忙。谢谢。

4

1 回答 1

1

使用 XSLT 1.0 在特定位置创建命名空间声明有点尴尬(在具有 的 2.0 中更容易<xsl:namespace>),但可以通过从样式表文档本身复制命名空间节点的技巧来完成:

<?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虽然如果您在样式表的其他地方需要andb前缀,这将不起作用。

于 2012-11-27T15:31:22.777 回答