首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT -如何选择top a到top b

XSLT -如何选择top a到top b
EN

Stack Overflow用户
提问于 2011-06-23 21:15:56
回答 3查看 208关注 0票数 2

如何提取B为“红色”的前两个C值(“Baby”和“Cola”)?输入实例为:

代码语言:javascript
复制
<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>

输出实例必须为:

代码语言:javascript
复制
<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>

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

EN

回答 3

Stack Overflow用户

发布于 2011-06-23 21:22:15

不需要破坏for-each:

代码语言:javascript
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2011-06-23 22:44:57

这可以用xsl:key很好地解决。

代码语言:javascript
复制
<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>

通过您的输入,给出

代码语言:javascript
复制
<Root>
  <D>Baby</D>
  <D>Cola</D>
</Root>
票数 2
EN

Stack Overflow用户

发布于 2011-06-23 21:33:25

不需要迭代,只需将模板应用于所需的元素:

代码语言:javascript
复制
  <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>

当应用于您的输入时,会给出:

代码语言:javascript
复制
<Root>
   <D>Baby</D>
   <D>Cola</D>
</Root>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6454623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档