按约束仅返回节点

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_')])