给出这个xml:
<root>
<list>
<!-- foo's comment -->
<item name="foo" />
<item name="bar" />
<!-- another foo's comment -->
<item name="another foo" />
</list>
</root>
我想使用XPath来选择所有在它们之前有注释的项目节点,也就是说我喜欢选择“foo”和“另一个foo”项,而不是“bar”项 .
我已经摆弄了前兄弟轴和comment()函数,但无济于事 .
3 回答
这似乎有效:
它会立即寻找跟随兄弟的评论,这些评论也是
<item>
元素 . 我不知道更好的方式来表达丑陋的部分 . 请注意,如果它被写成::item[1]
那么它也会发现<item>
没有立即被评论所取代 .The currently selected solution :
doesn't work 在注释和元素之间存在处理指令(或整组处理指令)的情况下 - 正如Martin Honnen的评论中所注意到的那样 .
The solution below doesn't have such a problem .
以下XPath表达式仅选择紧跟在注释节点之前的元素节点,或者紧接在仅有空白空间的文本节点之前,该节点前面紧跟注释节点:
Here is a complete test :
我们使用这个XML文档:
When the following transformation is applied on the above XML document :
the wanted, correct result is produced :
如this thread中所述,引入测试(
<xsl:if test="..."></xsl:if>
),如:前同辈::评论()
只测试节点是否有前面的兄弟节点是评论 .
如果你想知道,作为元素或评论的前面兄弟姐妹,最近的一个是评论,你可以尝试:
你可以试试:
要么
例如:
只会显示:
打字时:
有:
test.xml
:您的问题中显示了您的文件t.xslt
:上面的xslt文件res.xml
:生成的转换文件编辑:因为它没有考虑处理指令,我把答案留给了社区维基 .