Подтвердить что ты не робот

Как использовать XPath для подсчета количества узлов с определенным атрибутом

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

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

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

4b9b3361

Ответ 1

Я воспроизвел его с помощью 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 делает что-то неправильно.

Ответ 2

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

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

Производит правильный выход.