Xpath - как контролировать каждое значение элемента с другими?

ПРИМЕР:
Мой XML:

<root>
    <a>
        <b>1</b>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
    </a>
</root>
  • А теперь, как контролировать, чтобы каждый элемент "b" имел только одно и то же значение (а не только "1")?
  • Является ли это возможным? Я нашел только, но он не работает: //a/b != ./b
  • Я понятия не имею, кроме какого-то цикла или подсчета по значению в элементе ... но это не может быть в xpath или нет?

Спасибо за ответы.


person MmM ...    schedule 01.11.2014    source источник
comment
Учитывая этот пример XML, что вы хотите, чтобы возвращал XPath?   -  person har07    schedule 02.11.2014
comment
@ har07 - вероятно, правда/ложь ... все b одинаковы или нет. Я знаю, здесь это не имеет особого смысла, на практике мне это нужно для атрибута.   -  person MmM ...    schedule 02.11.2014
comment
Только констатация но это не работает без точного объяснения, почему это не работает, и без предоставления примера кода — нехороший стиль спрашивать. Особенно, если вы не уверены в правильной технической формулировке, демонстрация вашего примера кода может очень помочь.   -  person hakre    schedule 02.11.2014


Ответы (2)


Чтобы получить количество различных значений для всех узлов элемента /*/a/b, вы можете подсчитать различные значения этих элементов:

count(/*/a/b[not(. = preceding::b)])

Это выражение вернет 1, если есть одно отличное значение, 2, если два (как в вашем случае), или 0, если в документе нет элементов /*/a/b.

Пример PHP:

<?php

$buffer = <<<XML
<root>
    <a>
        <b>1</b>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
        <b>2</b>
    </a>
    <a>
        <b>1</b>
    </a>
</root>
XML;

$doc = new DOMDocument();
$doc->loadXML($buffer);
$xpath = new DOMXPath($doc);

echo $xpath->evaluate('count(/*/a/b[not(. = preceding::b)])');  # echoes 2
person hakre    schedule 02.11.2014
comment
Очень красиво, думаю, должно быть быстрее... тоже большое спасибо. - person MmM ...; 02.11.2014

Если вы подразумеваете под «управлением», что вы действительно хотите иметь логическое возвращаемое значение, сообщающее вам, имеют ли все элементы <b> одинаковое значение, вы можете использовать это выражение:

count(/root/a/b[. != ../b]) = 0

Он определяет <b>, значение которых не похоже на значения других <b>. Если число больше 1, то имеется несоответствие по крайней мере в одном b, поэтому выражение будет false. Если результирующий набор пуст, счетчик будет равен 0, а выражение будет true.

Этот ответ был вдохновлен Как я могу использовать XPath для поиска минимального значения атрибута в наборе элементов?.

person Marcus Rickert    schedule 01.11.2014