【发布时间】:2015-05-17 08:13:05
【问题描述】:
我知道这个问题之前已经回答过了,但是我很好奇如何在没有密钥的情况下实现这一点。
我有这个 XML,我必须获取 {%tab%} 和 {%endtab%} 之间的节点。
<element>
<hello>{%tab%}</hello>
<hello>yes</hello>
<hello>{%endtab%}</hello>
<hello>no</hello>
<hello>no</hello>
<hello>{%tab%}</hello>
<hello>yes</hello>
<hello>{%endtab%}</hello>
</element>
这是我得到的:
<xsl:template match="hello[preceding-sibling::hello[not(normalize-space(text())!='{%tab%}')]]
[following-sibling::hello[not(normalize-space(text())!='{%endtab%}')]]
[
(preceding-sibling::hello[not(normalize-space(text())!='{%tab%}')])[1]/(following-sibling::hello[not(normalize-space(text())!='{%endtab%}')])[1]
= (following-sibling::hello[not(normalize-space(text())!='{%endtab%}')])[1]
]">
<strong><xsl:value-of select="." /></strong>
</xsl:template>
这会选择所有跟在 {%endtab%} 之后和在 {%tab%} 节点之前的节点。
hello[preceding-sibling::hello[not(normalize-space(text())!='{%tab%}')]]
[following-sibling::hello[not(normalize-space(text())!='{%endtab%}')]]
这样做的问题是“否”节点也被选中,因为它们也在这些节点之间。所以,我必须确保跟在某个节点(第一次出现)之后的 {%endtab%} 与跟在前面的 {%tab%} 之后的那个节点相同,我使用这个 XPath:
[
(preceding-sibling::hello[not(normalize-space(text())!='{%tab%}')])[1]
/(following-sibling::hello[not(normalize-space(text())!='{%endtab%}')])[1]
= (following-sibling::hello[not(normalize-space(text())!='{%endtab%}')])[1]
]
但是,这并没有按预期过滤“否”节点。
【问题讨论】: