我正在寻找XPATH表达式,它将XML分成每个5个元素的块。这是通过单个XPATH表达式实现的,因为我使用的工具只接受单个表达式而不接受XSLT。像团体一样大约5个左右。
答案 0 :(得分:1)
使用XPath 3.1,您至少可以以某种方式构造结果,以获得5个元素的块,例如
let $items := root/item,
$size := 5
return
for $i in (1 to count($items))[position() mod $size = 1]
return array{$items[position() = ($i to ($i + $size - 1))]}
返回一个数组序列,其中每个数组都有$size
项(分别是剩下项的最后一个数组)。
https://xqueryfiddle.liberty-development.net/eiQZDbd显示结果(请注意,该工具支持XQuery 3.1,您可以使用更简单有效的方法进行分组和窗口化,但我尝试编写纯XPath 3.1表达式。)
不同的结果是单个数组,其中每个项目都是$size
个元素的序列,例如
declare namespace array = "http://www.w3.org/2005/xpath-functions/array";
array:join(
let $items := root/item,
$size := 5
return
for $i in (1 to count($items))[position() mod $size = 1]
return [$items[position() = ($i to ($i + $size - 1))]]
)
declare
再次是XQuery,使用纯XPath 3.1,您需要使用特定于API的方法,或者可能是确保声明数组函数的命名空间的工具。
答案 1 :(得分:0)
如果您的工具只接受XPath 1.0,那么您可以将position()
用作//item[(position()=1) or (position() <= 5)]
,然后将条件转换为6,10等。
xmllint --xpath '//item[(position()=1) or (position() <= 5)]' test.xml | sed -re 's%(</[^>]+>)%\1\n%g'
结果
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>