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

6

我可能在做一些愚蠢的事情,我打赌一定有更简单的方法... 我需要访问节点的命名空间。我的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"命名空间...有人能指导我吗?我在寻找什么?

你需要告诉我们你在寻找什么以及哪些东西不能正常工作。 - kosa
你在哪里找到了 local-namespace 函数? - Kirill Polishchuk
哦,天啊,抱歉,这是个错误。我是指local-name。我正在寻找一种访问“somenamespace”前缀的方法。它不起作用,因为local-name只返回“element”部分。 - aurel
3个回答

5

看起来你想测试节点是否位于非空名称空间中。正确的方法是:

namespace-uri() != ''

您不应该关注词法名称是否具有前缀或包含冒号,因为如果节点在命名空间中,则可以使用带有前缀或不带前缀的方式编写,这两种形式是等效的。

但我猜测您真正的基本要求是什么。


3

您正在寻找 name 函数,例如:

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

返回 somenamespace:element。这与IT技术有关。

3

根据OP的评论:

我正在寻找一种访问"somenamespace"前缀的方法。

您可以通过以下方式访问当前节点名称的前缀::

substring-before(name(), ':")

另一种方法:

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

上述代码会产生空字符串''或者前缀后面跟着':'字符。 检查当前节点名称是否有前缀:
not(name() = local-name())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接