当我在以下模板中匹配 A 或 A1 模板时,我想获得以下同级 C,仅适用于第二个 A 或 A1:
<root>
<A/> <!-- first A -->
<B/>
<A/> <!-- second A -->
<C/>
<A1/>
<B/>
<A1/>
<B/>
<C/>
</root>
如果我匹配第一个 A,我不必检索任何内容,因为在我的 C 标签之前还有另一个 A。
如果我匹配第二个 A,我必须检索 C 标签。
我尝试了以下方法,但没有成功:
<xsl:template match="A|A1">
<xsl:if test="following-sibling::C[preceding-sibling::A|A1[1] = .]">
似乎在每种情况下都是如此,但为什么呢?
在 XSLT 2.0 中,您可以使用类似
following-sibling::C[
(preceding-sibling::A|preceding-sibling::A1)[last()] is current()]
找到您首先想到的 C A
或A1
最近的 C 的所有 C。 对于 XSLT 1.0,您必须比较generate-id
值,而不是使用is
following-sibling::C[
generate-id((preceding-sibling::A|preceding-sibling::A1)[last()])
= generate-id(current())]
这将选择
<root>
<A/> <!-- nothing -->
<B/>
<A/> <!-- C1 -->
<C/> <!-- this is C1 -->
<A1/> <!-- nothing -->
<B/>
<A1/> <!-- C2 -->
<B/>
<C/> <!-- this is C2 -->
</root>
您的原始测试
following-sibling::C[preceding-sibling::A|A1[1] = .]
相当于
following-sibling::C[
( preceding-sibling::A | (child::A1[1]) ) = .]
并且将选择所有以下C
兄弟姐妹,其中 (a( 他们之前的任何 A
兄弟姐妹或 (b( 他们的第一个A1
子级具有与C
本身相同的字符串值。 文档中的所有C
元素都满足此谓词,因为每个元素都具有空字符串值。