【问题标题】:XPath 1.0 return string as node listXPath 1.0 返回字符串作为节点列表
【发布时间】:2023-04-04 05:39:01
【问题描述】:

我有一个奇怪的困境....

首先,我只使用 XPath 1.0,这是系统仍在使用的古老进程,所以虽然我很想使用 2.0,但它不会发生。

我有一个这样的节点: <Column Name="Letters">A, B, C, D, E, F, G, H, I</Column>

我希望 xpath 返回这些字母的节点列表。 这有可能吗?是否可以返回从字符串中存在的字母数派生的节点列表? 是否可以遍历字符串,并以某种方式保留字符串中下一个节点所在位置的索引?

欢迎提出任何建议、替代方案和建议。

提前致谢!

编辑: 如果如上所示有 9 个“字母”节点实例,是否可以使用(假设我已删除所有空格/逗号): substring(Letters,1,1) 来检索第一个值,然后当程序遍历到下一个节点,检索 substring(Letters,2,1) 等,但不是静态索引,而是返回类似:substring(Letters,node2outof9,1)?

编辑:EX)

<Column Name="Letters">A, B, C, D, E, F, G, H, I</Column> <Column Name="Letters">A, B, C, D, E, F, G, H, I</Column> <Column Name="Letters">A, B, C, D, E, F, G, H, I</Column> ...

假设我有以下伪代码:

节点列表中的 foreach 节点(列 @Name=Letters) 子字符串(节点,索引?,1)

是否有一个 xpath 函数或属性可以用来为我当前正在遍历的节点列表中的哪个节点提供索引?

我正在考虑一种解决方法,即使用当前节点的索引来获取我需要的字母。所以我要返回“Letters” 9 次,每次抓取一个字母,一次 1 个。

我知道这是一个奇怪的请求,所以我非常感谢任何帮助...

更新: 问题已解决,但必须使用解决方法,因为显然这不能仅使用 XPATH 来完成。感谢大家的建议和建议。用我提供的奇怪信息回答 Jakrabbit 以获得足够接近的解决方案。

【问题讨论】:

  • 什么在处理 XPath?通常,您可以使用 XSLT 或编程语言。
  • 嗨,马克-我无权访问处理程序,我看到的只是 XML,并且必须根据系统的要求编写足够的 XPath。在这种情况下,xml将我需要的数据存储为一串字母,我需要一个一个地给出字母。因此,如果可能,它必须在 XPath 而不是处理程序中完成。感谢您的回复!

标签: xpath


【解决方案1】:

你可以使用类似的东西:

fn:tokenize(Column[@Name="Letters"]/text(), ', ')

这会给你一个字母的节点集。然后你可以通过索引变量访问它。

fn:tokenize(Column[@Name="Letters"]/text(), ', ')[i]

http://www.w3.org/TR/xpath-functions/#func-tokenize

更新:我认为这将在 XPath 1.0 中做同样的事情,只要没有其他分隔符并且结果实际上是字母(1 个字符长)

substring(translate(/Column[@Name="Letters"]/text(), ', ', ''), i, 1)

【讨论】:

  • 我很欣赏 Jakrabbit 的响应,但你不能像节点一样使用子字符串函数,我也无法访问处理程序代码来引用索引。
  • 您绝对正确,您不能将函数调用用作定位步骤。我相应地更新了 xpath,并对其进行了测试。至于索引变量,你可能会卡住。
【解决方案2】:

XPath 选择现有节点,它不会创建任何新节点。因此,无论是 XPath 1.0 还是 2.0 都无关紧要,如果您想创建一个包含字母的新节点列表,您无法单独使用 XPath 来做到这一点,您需要像 XSLT 或 XQuery 这样的宿主语言来创建新节点。

【讨论】:

  • 感谢您的回复,很高兴知道!我用一个额外的问题/替代方案编辑了我的帖子。
  • 好吧,您的附加问题对我来说没有多大意义,您发布的 XML 有一个 Column 元素,而不是 Letters 元素,因此即使 substring(Letters,1,1) 也没有意义,因为它试图取一个不存在的Letters 元素的子字符串。
  • 抱歉造成混淆,我所说的 Letters 是指 Letters 列中的文本。因此,如果有 9 个 实例,我可以使用 xpath 确定我当前所在的实例吗?我会尽可能详细地编辑我的帖子...
猜你喜欢
  • 2011-05-13
  • 2011-12-10
  • 2016-11-27
  • 1970-01-01
  • 2012-12-07
  • 2020-11-18
  • 1970-01-01
  • 2010-11-27
  • 2011-03-25
相关资源
最近更新 更多