0

我有一个旧的 wddx 文件(并且可能必须经常这样做),我想为此编写一些 XSL,这将使我计算出具有具有特定属性的子节点的“顶级”节点的数量turn 有一个子节点,其文本值以某个子字符串开头。例如,这种语法让我获得了 82 个节点的计数(从技术上讲不是父节点,但每个父节点只有一个名称属性为“任务”的“var”节点)......

//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>
4

1 回答 1

0

您拥有的 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_')]

或计数(为您的示例 XML 返回 1)

count(//wddxPacket/data/array/struct/var/struct/var[@name='task']/string[starts-with(text(),'ST_')])
于 2016-03-14T13:35:47.627 回答