使用XPATH将XML拆分为5个块

时间:2018-05-28 15:27:58

标签: xml xslt xpath transformation

我正在寻找XPATH表达式,它将XML分成每个5个元素的块。这是通过单个XPATH表达式实现的,因为我使用的工具只接受单个表达式而不接受XSLT。像团体一样大约5个左右。

2 个答案:

答案 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>