Возврат только узлов по ограничению

У меня есть устаревший файл wddx (и, возможно, придется делать это часто), для которого я хочу написать некоторый XSL, для которого я получу счетчик количества узлов "верхнего уровня", у которых есть дочерний узел с определенным атрибутом, который в У поворота есть дочерний узел с текстовым значением, начинающимся с определенной подстроки. Этот синтаксис, например, дает мне счет в 82 узла (технически не родителей, но у каждого родителя будет только один узел "var" с атрибутом имени "task")...

//wddxPacket/data/array/struct/var/struct/var[@name='task']/string/starts-with(text(),"ST_")

... однако фактическое число узлов, которые я ищу, - это все узлы, которые возвращают значение true для указанного выше условия... так что count() этого синтаксиса, приведенного выше, приводит к 82... это должно быть 6, потому что только шесть из этих результатов верны.

Я думаю, что это связано с наборами узлов и созданием, которое вращается вокруг только того условия, которое я ищу. Я не считаю себя полным новичком в XSL... хе... но некоторые из вас могут. Во всяком случае... Я искал вокруг, и я просто не уверен, что ищу правильную вещь и мог бы использовать некоторые рекомендации.

Вот выдержка из XML (wddx)...

<wddxPacket version="1.0">
<header/>
<data>
    <array length="1">
        <struct type="mydata">
            <var name="serverscheduletask#$%^DEFAULT#$%^SA-QW_71">
                <struct type="schedule-data">
                    <var name="task">
                        <string>SA-QW_71</string>
                    </var>
                </struct>
            </var>
            <var name="serverscheduletask#$%^DEFAULT#$%^ST_FRED">
                <struct type="schedule-data">
                    <var name="task">
                        <string>ST_FRED</string>
                    </var>
                </struct>
            </var>
            <var name="serverscheduletask#$%^DEFAULT#$%^SA-QW_16">
                <struct type="schedule-data">
                    <var name="task">
                        <string>SA-QW_16</string>
                    </var>
                </struct>
            </var>
            <var name="serverscheduletask#$%^DEFAULT#$%^ST_TEST">
                <struct type="schedule-data">
                    <var name="task">
                        <string>ST_TEST</string>
                    </var>
                </struct>
            </var>
            <var name="serverscheduletask#$%^DEFAULT#$%^SA-QW_71">
                <struct type="coldfusion.scheduling.ScheduleTagData">
                    <var name="task">
                        <string>SA-QW_71</string>
                    </var>
                </struct>
            </var>
        </struct>
    </array>
</data>
</wddxPacket>

1 ответ

Решение

Выражение xpath, которое вы имеете, действительно допустимо только в Xpath 2.0. starts-with Функция возвращает логическое значение, поэтому ваше выражение возвращает последовательность логических значений.

false true false true false

Если вы затем используете функцию count, она просто подсчитает все логические значения в последовательности, будь то истина или ложь.

Вы, вероятно, хотите выразить это...

//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')]

Или в счетчике (который возвращает 1 для вашего образца XML)

count(//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')])
Другие вопросы по тегам