【问题标题】:XSLT NamespacesXSLT 命名空间
【发布时间】:2014-01-20 15:04:02
【问题描述】:

我有一个关于 XSLT 命名空间的基本问题。
XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:x="myNamespace" exclude-result-prefixes="x">
    <xsl:template match="/">
        <newNode>
            <xsl:value-of select="x:Node1/x:Node2" />
        </newNode>
    </xsl:template>
</xsl:stylesheet>

当我将这个 XSLT 应用到时,它可以正常工作:

<Node1 xmlns="myNamespace">
    <Node2>ValueIWant</Node2>
</Node1>

但是当我将它应用到时它没有找到“ValueIWant”:

<ns0:Node1 xmlns:ns0="myNamespace">
    <Node2>ValueIWant</Node2>
</ns0:Node1>

我觉得我只是缺少对 XSLT 名称空间的一些基本了解。非常感谢任何帮助。

【问题讨论】:

    标签: xml xslt xml-namespaces


    【解决方案1】:

    在您的第一个输入文件中:

    <Node1 xmlns="myNamespace">
        <Node2>ValueIWant</Node2>
    </Node1>
    

    您在节点 Node1 上定义了 默认命名空间。对于 Node1 及其任何子节点(除非/直到您在子节点中重新定义它),空命名空间前缀绑定到 myNamespace。所以 Node1 和 Node2 都在myNamespace

    在您的第二个输入文件中:

    <ns0:Node1 xmlns:ns0="myNamespace">
        <Node2>ValueIWant</Node2>
    </ns0:Node1>
    

    您正在定义命名空间前缀 ns0 以指向 myNamespace,但您尚未定义默认命名空间。所以 Node1 在命名空间 myNamespace 但 Node2 根本不在任何命名空间中。

    您的 xpath 表达式 x:Node1/x:Node2(前缀 x 绑定到 myNamespace)正在寻找元素 Node1 和子 Node2,这些元素 both 在命名空间 myNamespace 中。在您的第二个输入文件中,Node2 不在该命名空间中,因此 xpath 表达式不匹配,因此您不会得到 ValueIWant

    您可以像这样更正第二个输入文件:

    <ns0:Node1 xmlns:ns0="myNamespace">
        <ns0:Node2>ValueIWant</ns0:Node2>
    </ns0:Node1>
    

    【讨论】:

    • 非常感谢您的快速回答。我的印象是命名空间级联到子节点。这有什么道理吗?
    • 是的,在某种程度上他们是这样做的。前缀之间的绑定(无论是第一个输入中的空前缀还是第二个输入中的“ns0”)级联到子节点。您不必在 Node2 上重复 xmlns:ns0="myNamespace"。但是前缀是分开的,所以定义前缀 ns0 对空前缀的绑定没有任何作用。
    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多