【问题标题】:XPath 节点的变量
【发布时间】:2022-01-20 19:31:46
【问题描述】:

我开始学习 XSLT/XPath,我从学习指南中复制了以下内容,并进行了一些修改:

    <xsl:variable name="fname"   select="'polist.xml'"/>
    <xsl:variable name="thePath" select="'/collection/doc'"/>
    ...
    <xsl:value-of select="count(doc($fname)/collection/doc)"/>

它报告 XML 文件中 doc 元素的数量。 doc() 函数接受文件名变量“fname”。但是,如果我尝试对 count() 函数中的 'thePath' 变量执行相同的操作,使用 $thePath 而不是“/collection/doc”文本,则会出现错误。

关于是否/如何在 count() 函数中使用“thePath”变量的建议?可能吗?谢谢!

【问题讨论】:

  • 在 XSLT 3.0 中,您可以使用 xsl:evaluate 指令将 string 转换为 expressionw3.org/TR/xslt-30/#dynamic-xpath
  • 您使用哪个版本的 XSLT 和/或 XPath? doc 函数的使用表明它应该是 XPath 2.0 或更高版本,并且 count($thePath) 应该可以工作,计算变量绑定到的单个字符串值。即给出值1。因此,这可能不是您想到的用例。正如其他人评论或回答的那样,XSLT 3 有 xsl:evaluate 来评估表示 XPath 表达式的字符串。

标签: xslt


【解决方案1】:

在 XSLT 3 中使用 xsl:evaluate 的示例如下:

<xsl:evaluate xpath="'count(' || $thePath || ')'" context-item="doc($fname)"/>

【讨论】:

    【解决方案2】:

    从示例中学习会让您非常容易遇到此类问题:对于示例的实际工作方式,很容易构建一个完全错误的心智模型。这就是为什么我总是建议人们先阅读一本解释概念的好书。

    在您的情况下,您犯了一个常见错误,即假设变量像宏一样工作,也就是说,它们表示可以替换为表达式的 XPath 文本片段。情况并非如此:变量代表值,是对表达式求值的结果,您只能在可能出现文字值(如数字或字符串)的地方使用变量。

    (我怀疑是$ 符号的使用导致了这种错误印象。$ 通常用于表示类似宏的语言中的变量,例如 shell 脚本)。

    在 XPath 1.0 中,没有直接的方法可以实现您想要做的事情。在实践中,人们要么为此使用供应商扩展,要么构建一个管道,在该管道中,阶段 1 生成 XSLT 样式表,阶段 2 执行它(这在 XSLT 中比在大多数其他语言中更容易,因为 XSLT 是 XML,因此可以使用XSLT)。

    在 3.0 中,您可以使用 xsl:evaluate 指令评估以字符串形式提供的 XPath 表达式。但很多时候,使用功能可以更好地满足需求。我们不知道这里真正的基本要求是什么,因此很难知道在这种情况下是否属实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2015-02-21
      • 1970-01-01
      相关资源
      最近更新 更多