Как использовать XPath для подсчета количества узлов с определенным атрибутом - PullRequest
28 голосов
/ 05 марта 2010

Я не могу заставить выражение XPath работать для моего сценария. Я хочу найти все узлы «Устройство», которые имеют тип «EndDevice». Я могу сосчитать все узлы «Устройства» и найти все узлы «Устройства» с атрибутом «EndDevice». Однако я не могу их объединить!

count(//Device) //works
//Device[@xsi:type='EndDevice'] //works
count(//Device[@xsi:type='EndDevice']) //doesn't work

Если это имеет значение, я использую XPathBuilder.

Ответы [ 2 ]

21 голосов
/ 05 марта 2010

Я воспроизвел его с помощью XPathBuilder 2.0.0.4.Однако выражение XPath работает и правильно оценивается в онлайн-оценщике, который я пробовал (http://www.whitebeam.org/library/guide/TechNotes/xpathtestbed.rhtm).

РЕДАКТИРОВАТЬ: также пробовал с последней версией Altova XMLspy

ввод:

<?xml version="1.0"?>
<asdf xmlns:xsi="n/a">
    <Device xsi:type='EndDevice'/>
    <Device xsi:type='EndDevice'/>
    <Device xsi:type='EndDevice'/>
    <Device xsi:type='EndDevice'/>
</asdf>

xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsi="n/a">
    <xsl:output indent="yes"/>
    <xsl:template match="*">
        <output>
            <xsl:value-of select="count(//Device[@xsi:type = 'EndDevice'])"/>
        </output>
    </xsl:template>
</xsl:stylesheet>

вывод:

<?xml version="1.0" encoding="UTF-8"?>
<output xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsi="n/a">4</output>

Я думаю, что XPathBuilder делает что-то не так.

3 голосов
/ 13 февраля 2013

Использование вышеуказанного xml-файла, сохраненного в test.xml, и использование инструмента http://kernowforsaxon.sourceforge.net/

declare namespace xsi="n/a"; 
count(doc('test.xml')//Device[@xsi:type = "EndDevice"])

Создает правильный вывод.

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