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。

预期出品:

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

尽管如果您需要样式表中其他地方的ab前缀,这将不起作用。

相关内容

  • 没有找到相关文章

最新更新