【问题标题】:XSLT Specify name space in parent nodeXSLT 在父节点中指定名称空间
【发布时间】:2012-11-27 15:02:13
【问题描述】:

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

请帮忙。谢谢。

【问题讨论】:

  • 首先阅读此Why XSLT
  • @vels4j:我知道它用于将 XML 转换为 XML。我也在做同样的事情,但这里的输出 XML 应该提到结构。我已经更新了这个问题。请让我知道这是否有意义。

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


【解决方案1】:

使用 XSLT 1.0 在特定位置创建命名空间声明有点尴尬(在具有 &lt;xsl:namespace&gt; 的 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('')/*&lt;xsl:stylesheet&gt; 元素。然后,我们从该元素中提取绑定到指定前缀的 命名空间节点,并将其复制到输出文档。

或者,从&lt;xsl:stylesheet&gt; 中取出命名空间声明并使用文字结果元素:

<?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 前缀,这将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2017-06-13
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2013-08-24
    相关资源
    最近更新 更多