0

当我在下面匹配 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] = .]">

在每种情况下似乎都是正确的,但为什么呢?

4

1 回答 1

1

在 XSLT 2.0 中,您可以使用类似的测试

following-sibling::C[
    (preceding-sibling::A|preceding-sibling::A1)[last()] is current()]

找到最接近的前面的所有 CA或是A1您首先想到的 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孩子的字符串值与自身的字符串值相同CC文档中的所有元素都满足此谓词,因为每个元素都具有空字符串值。

于 2013-07-16T17:35:25.390 回答