首页 > 解决方案 > XPath 可以按中间节点对选定节点列表进行分组吗?

问题描述

我有以下 XML 字符串:

<?xml version="1.0" encoding="UTF-8"?>
<a>
  <b>
    <c>r</c>
    <c>s</c>
    <c>t</c>
  </b>
  <b>
    <c>u</c>
    <c>v</c>
    <c>w</c>
  </b>
  <b>
    <c>x</c>
    <c>y</c>
    <c>z</c>
  </b>
</a>

通过“a/b/c/text()”的 XPath 查询,我可以轻松提取列表:

[ r, s, t, u, v, w, x, y, z ]

是否可以像这样获得按级别“b”分组的结果:

[
  [ r, s, t ],
  [ u, v, w ],
  [ x, y, z ] 
]

小提琴

标签: xmlxpath

解决方案


不,仅 XPath 无法生成字符串列表:

  • XPath 1.0 的节点集从不嵌套。
  • XPath 2.0/3.1 的序列从不嵌套。

通常,XPath 用于选择,而不是转换。在您的第一个示例中,XPath 选择文本节点列表并将它们显示为字符串值列表。

要进一步转换由一个或多个 XPath 表达式选择的节点,请使用宿主语言(XSLT、Python、JavaScript 等)的通用编程工具。


更新:根据您的评论,您表示所需分组的词汇表示就足够了。是的,您可以通过字符串函数组成目标输出:

XPath 2.0

concat('[', 
       string-join(for $b in /a/b
                       return concat('[',string-join($b/c,','),']'),
                   ','),
       ']')

推荐阅读