按约束仅返回节点
Returning only nodes by constraint
我有一个遗留的 wddx 文件(并且可能必须经常这样做),我想为此编写一些 XSL,这将使我计算出 "top-level" 个具有子节点的节点的数量某个属性又具有一个子节点,该子节点的文本值以某个子字符串开头。例如,这种语法让我得到 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>
您的 xpath 表达式实际上只在 Xpath 2.0 中有效。 starts-with
函数 returns 一个布尔值,因此您的表达式返回一个布尔值序列。
false true false true false
如果您随后使用计数函数,它只会计算序列中的所有布尔值,无论它们是真还是假。
你可能想要的表达是这样的...
//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')]
或者计数(returns 1 代表你的样本 XML)
count(//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')])
我有一个遗留的 wddx 文件(并且可能必须经常这样做),我想为此编写一些 XSL,这将使我计算出 "top-level" 个具有子节点的节点的数量某个属性又具有一个子节点,该子节点的文本值以某个子字符串开头。例如,这种语法让我得到 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>
您的 xpath 表达式实际上只在 Xpath 2.0 中有效。 starts-with
函数 returns 一个布尔值,因此您的表达式返回一个布尔值序列。
false true false true false
如果您随后使用计数函数,它只会计算序列中的所有布尔值,无论它们是真还是假。
你可能想要的表达是这样的...
//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')]
或者计数(returns 1 代表你的样本 XML)
count(//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')])