2011-06-23 21 views
2

如何提取第一個2個C值('Baby'和'Cola'),其中B爲'RED'。輸入實例:XSLT - 如何選擇頂部a到頂部b

<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> 

我想過了,每一個和全局變量的組合。但是在XSLT中,不可能更改全局變量的值來打破for-each。我不知道了。

回答

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> 
+0

這也輸出移動。問題要求第一個2. – earlNameless

+0

但是,這將選擇'寶貝','可樂'和'移動',只需要前兩項:'寶貝'和'可樂'。 – user812241

+0

謝謝,我會測試它。 – user812241

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> 
+0

迭代有什麼問題?對於這樣一個簡單的任務,我不確定是否需要這樣複雜的xpath表達式...... – Erlock

+1

不需要迭代,但也沒有必要使它變得如此複雜。參見Erlock的解決方案。 –

+0

@邁克爾是的,我明白了,替代答案應該有所不同:) –

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>