【问题标题】:workaround for missing let in xpath 2.0?xpath 2.0 中缺少 let 的解决方法?
【发布时间】:2020-03-24 06:10:31
【问题描述】:

让我们考虑以下 xml:

<a>
    <b id="1"/>
    <b id="2"/>
</a>

我了解我可以使用单个值

for $a in //b[@id=1] return $a

而不是 xpath 3.0 表达式

let $a := //b[@id=1] return $a

但是如何使用 for 将序列放入变量中?

显然

for $a in //b return $a[2]

不会返回任何东西,所以它不是一个很好的替代品

let $a := //b return $a[2]

我尝试构造一个序列,其中 //b 是第一个元素, () 是第二个元素,并使用它,但我不知道该怎么做。

【问题讨论】:

  • 嗯,在 XSLT 中,您始终可以在 XSLT 级别使用 xsl:variable,而不是尝试在 XPath 级别使用 let。在您的简单示例中,我看不出您为什么需要或认为您根本需要 for 表达式,(//b)[2] 不是您想要的吗?
  • 当然,但这是一个纯 xpath 环境。我最终实现了一个具有相同功能的函数。幸运的是我已经实现了一个评估函数。
  • 如果是关于纯 XPath 的问题,为什么要标记为 xslt-2.0
  • 这显然是个错误。

标签: xpath-2.0


【解决方案1】:

使用

 for $len in count(/*/b),
     $ind in 1 to $len
   return
      (/*/b)[$ind]

基于 XSLT 2.0 的验证

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
    <xsl:sequence select=
    "for $len in count(/*/b),
         $ind in 1 to $len
       return
          (/*/b)[$ind] "/>
  </xsl:template>
</xsl:stylesheet>

当此转换应用于提供的 XML 文档时

<a>
    <b id="1"/>
    <b id="2"/>
</a>

计算 XPath 表达式,并输出作为此计算结果的序列:

<b id="1"/>
<b id="2"/>

【讨论】:

    猜你喜欢
    • 2016-10-19
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多