Разделите XML на 5 блоков по XPATH. - PullRequest
0 голосов
/ 28 мая 2018

Ищу выражения XPATH, которые разбивают XML на куски по 5 элементов в каждом.Это достижимо с помощью одного выражения XPATH, поскольку инструмент, с которым я работаю, принимает только одинаковые выражения, а не XSLT.Что-то вроде группы на счет 5 или около того.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Если ваш инструмент принимает только 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>
0 голосов
/ 28 мая 2018

С 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))]]
)

The declare снова XQuery, с чистым XPath 3.1 вам нужно использовать специфический для API способ или, возможно, инструмент, который гарантирует, что пространство имен для функций массива объявлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...