【问题标题】:Get current nodes xpath获取当前节点 xpath
【发布时间】:2012-05-17 13:36:22
【问题描述】:

我需要获取我为其编写了 xsl 函数的当前节点的 xpath

<func:function name="fn:getXpath">
    <xsl:variable name="xpath">
        <xsl:for-each select="ancestor-or-self::*">
            <xsl:value-of select="concat($xpath, name())" />
            <xsl:if test="not(position()=last())">
                <xsl:value-of select="concat('/', $xpath)" />
            </xsl:if>
        </xsl:for-each>
    </xsl:variable>
    <func:result select="$xpath" />
</func:function>

但是当我运行它时,我收到以下错误

file:///D:/test.xsl; Line #165; Column #63; Variable accessed before it is bound!
file:///D:/test.xsl; Line #165; Column #63; java.lang.NullPointerException

我正在使用 xalan 2.7.0。请帮忙。

【问题讨论】:

  • Evem 修复明显错误后,生成的表达式通常是正确的。为什么?因为在一般情况下,这个 XPath 表达式会选择很多元素——而不仅仅是一个。
  • 如果你有两个同名的兄弟姐妹,你就会遇到问题——&lt;a&gt;&lt;b /&gt;&lt;b /&gt;&lt;/a&gt; 将为两个&lt;b /&gt; 节点提供相同的表达式。您应该找到一种添加[1][2] 等的方法,可能使用position() 函数或preceding-sibling 轴。

标签: xslt reflection xpath xslt-1.0 xalan


【解决方案1】:

在您的示例中,您尝试在定义本身中使用变量,这是无效的。

看起来您的意图是尝试修改现有值的值。然而 XSLT 是一种函数式语言,因此变量是不可变的。这意味着一旦定义,您就无法更改该值。

在这种情况下,您不需要那么复杂。您可以只删除对变量本身的引用,您将获得所需的结果

<func:function name="fn:getXpath">
   <xsl:variable name="xpath">
      <xsl:for-each select="ancestor-or-self::*">
         <xsl:value-of select="name()"/>
         <xsl:if test="not(position()=last())">
            <xsl:value-of select="'/'"/>
         </xsl:if>
      </xsl:for-each>
   </xsl:variable>
   <func:result select="$xpath" />
</func:function> 

【讨论】:

    【解决方案2】:

    您在变量本身的定义中使用了变量$xpath

    <func:function name="fn:getXpath">
        <xsl:variable name="xpath">  
            <xsl:for-each select="ancestor-or-self::*">
                <xsl:value-of select="concat($xpath, name())" />   <-------
                <xsl:if test="not(position()=last())">
                    <xsl:value-of select="concat('/', $xpath)" />  <-------
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <func:result select="$xpath" />
    </func:function>
    

    那个时候变量是未知的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2015-03-30
      • 1970-01-01
      相关资源
      最近更新 更多