【问题标题】:XPath predicate using last function使用最后一个函数的 XPath 谓词
【发布时间】:2016-08-22 01:56:24
【问题描述】:

我正在寻找 XPath 1.0 语句。我不能使用 XSLT。

XML 示例

<root>
  <data>
    <okay>Hello</okay>
  </data>
  <data>
    <okay>World</okay>
  </data>
</root>

我需要提取最后保留xml结构的数据内容。结果应如下所示

<root>  
  <data>
    <okay>World</okay>
  </data>
</root>

很遗憾,我无法搜索 okay 元素中的值,因为它是动态的。

我尝试了以下方法,但它返回了所有内容:

/root[data[last()]]

【问题讨论】:

  • 由于 XPath 无法满足您的需求,或许您应该告诉我们更多有关您的技术限制的信息,以便我们提出替代方案。
  • XPath 只是首选。如果没有其他使用 XPath 的解决方案,我将接受 @kjhughes /root/data[last()]。我将需要更改下游流程中的分配。我试图避免这种情况。

标签: xml xpath


【解决方案1】:

XSLT getting last element

根据该示例,它将是:

(//root/data/okay)[last()]

括号将它们列出来,方括号允许您根据从 1 开始的索引来说明您想要该列表中的哪个元素。在您的示例中,索引为 2,但您不想硬编写任何动态的代码。

(//root/data/okay)[2]

我也不确定你所说的“okay”元素是动态的是什么意思,它总是有相同的标签吗?还是您指的是数据变化?

如果标签不同,您可以执行以下操作:

(//root/data/*)[last()]

【讨论】:

  • 更正元素保持不变,但数据是动态的
  • 你完全错过了 OP 的观点。他希望构建一个包含最后一个 data 元素 其父元素的结果。这在 XPath 中是不可能的。
  • (//root/data/okay)[last()] 确实给出了正确的结果
  • @BlakeBurgette: (//root/data/okay)[last()] 将仅返回示例中的最后一个 okay 元素,而不是您请求的包含其 rootdata 祖先的结果。你的意思是说它没有给出正确的结果吗?
  • @kjhughes 我的意思是没有给出正确的结果。谢谢你纠正我。
【解决方案2】:

XPath 用于选择,但您寻求的输出不是可以从您的 XML 文档中选择的。

XSLT 用于转换,这就是您需要生成一个无法仅通过选择生成的结果。

如果您愿意放弃结果中的 root 元素,

<data>
  <okay>World</okay>
</data>

以下 XPath 将选择目标 data 元素:

 /root/data[last()]

【讨论】:

  • 是的,我遇到了那个解决方案,它确实有效。但是,我需要保留根标签。谢谢
  • 重申您的要求并不会改变 XPath 选择的事实;它不会转换。答案是 XPath 不是您定义的工作的错误工具。
猜你喜欢
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多