XSLT - 如何选择顶部a到顶部b

时间:2011-06-23 13:15:56

标签: xml xslt

如何在B为'RED'的地方提取前2个C值('Baby'和'Cola')。输入实例是:

<Root>
  <A>
    <B>BLACK</B>
    <C>Apple</C>
  </A>
  <A>
    <B>RED</B>
    <C>Baby</C>
  </A>
  <A>
    <B>GREEN</B>
    <C>Sun</C>
  </A>
  <A>
    <B>RED</B>
    <C>Cola</C>
  </A>
  <A>
    <B>RED</B>
    <C>Mobile</C>
  </A>
</Root>

输出实例必须是:

<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>

我考虑过for-each和全局变量的组合。但是在XSLT中,不可能更改全局变量的值来打破for-each。我不知道了。

3 个答案:

答案 0 :(得分:3)

无需打破for-each:

<xsl:template match="Root">
  <xsl:copy>
    <xsl:for-each select="(A[B='RED']/C)[position() &lt; 3]">
      <D><xsl:value-of select="." /></D>
    </xsl:for-each>
  </xsl:copy>
</xsl:template>

答案 1 :(得分:2)

使用xsl:key非常优雅地解决了这个问题。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:key name="kB" match="A" use="B" />

  <xsl:template match="Root">
    <xsl:copy>
      <xsl:apply-templates select="key('kB', 'RED')[position() &lt; 3]" />
    </xsl:copy>     
  </xsl:template>

  <xsl:template match="A">
    <D><xsl:value-of select="C" /></D>
  </xsl:template>

</xsl:stylesheet>

给出您的输入

<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>

答案 2 :(得分:1)

无需迭代,只需将模板应用于所需元素:

  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="Root">
        <Root>
            <xsl:apply-templates select="A/B[
                .='RED' 
                and 
                count(../preceding-sibling::A[B='RED'])&lt;2]"/>
        </Root>     
    </xsl:template>


    <xsl:template match="B">
        <D>
            <xsl:value-of select="following-sibling::C"/>
        </D>
    </xsl:template>

</xsl:stylesheet>

在您的输入上应用时:

<Root>
   <D>Baby</D>
   <D>Cola</D>
</Root>