Найти максимальное количество детей с XPath 1,0 - PullRequest
2 голосов
/ 07 января 2010

Могу ли я найти один узел XML с наибольшим количеством детей с XPath?

<xml>
  <node id="1">
    <child />
  <node>
  <node id="2">
    <child /><child />
  <node>
  <node id="3">
    <child /><child />
  <node>
  <node id="4">
    <child /><child /><child />
  <node>
  <node id="5">
    <child /><child /><child />
  <node>
</xml>

Я бы хотел выбрать либо узел 4, либо узел 5 с одним чистым выражением XPath 1.0.

Ответы [ 3 ]

2 голосов
/ 06 августа 2010

Я знаю, что это довольно старо, но если это кому-нибудь поможет, я бы хотел сделать это, и я думаю, что это работает, по крайней мере, для меня:

/ xml / node [count (./ child)> count (follow-sibling :: node / child) и count (./ child)> count (previous-sibling :: node / child)] * ​​1003 *

Я не очень хорош в Xpath, так что, может быть, я что-то упустил.

1 голос
/ 07 января 2010

Я тоже не думаю, что это возможно (учитывая тот факт, что я не смог это сделать :)). Конечно, если вам разрешено изменять xml (даже просто временно во время этой обработки), вы можете обновить его, чтобы поместить количество дочерних элементов в качестве атрибута на узле (или в качестве самого значения узла), после чего это легко:

/xml/node[not(../node/@childCount > ./@childCount)]

или

/xml/node[not(../node > .)]

Но вы, наверное, уже знаете это.

Другая вещь, которую я подумал, может сработать, чтобы сделать некоторые умные вычисления по принципу линий голубиных отверстий, взять в качестве входных данных общее число детей и число node с и получить минимальное число детей, которое максимально узел должен иметь, а затем делать

/xml/node[child[position()=formula_for_magic_number_goes_here]]

но вскоре я понял, что не могу придумать такую ​​формулу, которая бы правильно работала во всех случаях - например, если бы было 10 node s с количеством детей 10, 99 1, 1, (и остальные 1 тоже), никакие манипуляции с числами 27 и 10 не приведут к точке отсечения, которая включает 10, но исключает 9.

1 голос
/ 07 января 2010

Я думаю, что это невозможно, потому что для подсчета детей нужна функция count(), которая имеет один параметр - набор узлов и возвращает количество элементов в этом наборе. Таким образом, у вас нет возможности подсчитать больше наборов узлов, чем один, чтобы получить максимальное значение.

Примечание: я говорю о XPath 1.0

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