查找 xPATH 以选择以下同级,而不是在与 XSL 中的当前相同的另一个标记之后



当我在以下模板中匹配 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 AA1最近的 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元素都满足此谓词,因为每个元素都具有空字符串值。

相关内容

  • 没有找到相关文章

最新更新