XPath - 仅为此节点获取命名空间节点(即不是祖先节点)

时间:2016-09-12 14:20:13

标签: xml xslt xpath namespaces

在XSLT中,以下XPath检索在范围中的所有命名空间的命名空间节点。这些包括为当前节点定义的名称空间,以及在当前节点的祖先中定义的名称空间。

<xsl:for-each select="namespace::*">
  ...
</xsl:for-each>

我想只检索为当前节点明确定义的命名空间节点,即不是从祖先范围继承的节点。

如何?

2 个答案:

答案 0 :(得分:1)

一般来说,这是不可能的。您只能列出与任何父命名空间节点都不匹配的命名空间节点:

<xsl:for-each select="namespace::*">
    <xsl:if test="not(../../namespace::*[name() = name(current())] = .)">
        <!-- different -->
    </xsl:if>
</xsl:for-each>

但是这不会列出使用与父级相同的前缀和URI重新定义的命名空间节点。

答案 1 :(得分:1)

&#34;我只想检索为当前节点明确定义的命名空间节点&#34;

命名空间声明不构成XDM数据模型的一部分:例如,如果存在重复的冗余命名空间声明,则无法通过XPath发现此问题,因为命名空间信息以规范化方式呈现表单,其中XDM仅告诉您哪些名称空间是元素的范围,而不是它们被声明的位置。你可以得到的最接近的是找到一个元素的范围内的命名空间,而不是它的父节点,@ nwellnhof已经向你展示了它。