Возврат только узлов по ограничению
У меня есть устаревший файл 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_')])