如何在xslt中获取节点的命名空间?

时间:2011-12-27 19:27:08

标签: xml xslt xpath namespaces

我可以在这里做一些愚蠢的事情,我打赌有一种更简单的方法......我需要访问一个节点的命名空间。我的xml中的元素看起来像这样:

<somenamespace:element name="SomeName">

然后在我的xslt中,我使用:

访问这些元素
 <xsl:template  match="*[local-name()='element']">
    <xsl:variable name="nodename">
      <xsl:value-of select="local-name(current())"/>
    </xsl:variable>

<xsl:choose>
  <xsl:when test="contains($nodename,':')">

嗯,当然它不起作用,因为即使在模板匹配中也没有“somenamespace”命名空间......

任何人都可以指导我,我在寻找什么?

3 个答案:

答案 0 :(得分:3)

在我看来,您好像要测试该节点是否在非null命名空间中。正确的方法是

namespace-uri() != ''

您不应该查看词法名称是否具有前缀或包含冒号,因为如果该节点位于命名空间中,则可以使用前缀或不使用前缀来编写,并且这两种形式是等效的。< / p>

但我猜测你的真实,潜在的要求是什么。

答案 1 :(得分:1)

您正在寻找name功能,例如:

<xsl:value-of select="name()"/>

返回somenamespace:element

答案 2 :(得分:1)

来自OP的评论:

  

我正在寻找一种方法来访问“somenamespace”前缀。

您可以通过

访问当前节点名称的前缀
substring-before(name(), ':")

另一种方式

substring-before(name(), local-name())

以上产生空字符串''或前缀,后跟':'字符。

检查当前节点的名称是否带有前缀

not(name() = local-name())