Функция XPath Count всегда возвращает 0.0

1

Я использую ниже xml, чтобы получить количество тегов 'c'.

<?xml version='1.0' encoding='UTF-8'?>
<xyz xmlns=".....">
<a>
  <b>
    <c>X:1 Y:0</c>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
  <b>
    <c>X:1 Y:0</c>
    <c>X:2 Y:0</c>
  </b>
</a>
</xyz>

Ниже мой код Java:

xpath = factory.newXPath();
xpr = xpath.compile("count(//xyz/a/b/c)");
System.out.println(xpr.evaluate(inputSource, XPathConstants.NUMBER));

Но приведенный выше код всегда возвращает 0.0

Я делаю что-то неправильно?

  • 0
    Для начала, ваш XPath не учитывает пространство имен.
  • 0
    Но я только что попробовал свой вариант использования здесь .. freeformatter.com/xpath-tester.html#ad-output он дал мне вывод как 5.0
Показать ещё 1 комментарий
Теги:
xpath
domdocument

2 ответа

2
Лучший ответ

Если вы хотите подсчитать элементы с локальным именем xyz, выражение должно быть следующим:

XPathExpression xpr = xpath.compile("count(//*[local-name()='xyz']/*[local-name()='a']/*[local-name()='b']/*[local-name()='c'])");

Demo.

  • 0
    Это все еще возвращает 0.0
  • 0
    @peeppeep Оказывается, что тот же трюк должен быть применен к другим трем уровням (см. редактирование и демонстрацию).
1

Не удаляйте значение атрибута пространства имен. Это важно, потому что это фактическое пространство имен.

xmlns="urn:somevalue" определяет пространство имен по умолчанию для элементов. A <xyz xmlns="urn:somevalue"/> или <ns1:xyz xmlns:ns1="urn:somevalue"/> можно читать как имя узла {urn:somevalue}:xyz.

XPath 1.0 не имеет пространства имен по умолчанию. Вы всегда должны использовать префикс для узлов в пространстве имен.

Поэтому, если вы определяете префикс ns1 в преобразователе пространства имен для вашего XPath, выражение будет выглядеть так:

count(//ns1:xyz/ns1:a/ns1:b/ns1:c)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню