2012-02-01 16 views
0

輸出中「can」元素的數量應等於輸入xml中「a」元素下「c」元素的出現次數。因此,第一次連續發生的「can」元素應該是3(因爲輸入中的a元素的第一個連續出現次數是3),並且根據輸入,「can」元素的下一個連續出現次數應該是2。然而,在我目前的輸出中,它總共重複了5次。我認爲下面這行應該改變,但不知道如何改變,嘗試使用position()。這是模板只適用於C第一(使用計數../)a,然後第二個a。xslt在使用計數函數的組下應用模板

行了,我認爲應該改變

<xsl:apply-templates select="/*/*[$coun]/c"/> 

我輸入XML

<Root> 
    <a> 
    <b>12</b> 
    <c>1</c> 
    <c>2</c> 
    <c>3</c> 
    </a> 
    <a> 
    <b>12</b> 
    <c>a</c> 
    <c>c</c> 
    </a> 
</Root> 

我的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="/"> 
     <Root> 
     <xsl:apply-templates select="*/*/b"/> 
     </Root> 
    </xsl:template> 
    <xsl:template match="b"> 
    <a> 
     <xsl:value-of select="../b"/> 
    </a> 
    <xsl:variable name="coun"> 
     <xsl:value-of select="count(../preceding-sibling::a) + 1"/> 
    </xsl:variable> 
    <xsl:apply-templates select="/*/*[$coun]/c"/> 
    </xsl:template> 
    <xsl:template match="c"> 
    <can>abc</can> 
    </xsl:template> 
</xsl:stylesheet> 

我的電流輸出

<Root> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
</Root> 

我的預期輸出

<Root> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
</Root> 

回答

4

輸入:

<Root> 
    <a> 
    <b>12</b> 
    <c>1</c> 
    <c>2</c> 
    <c>3</c> 
    </a> 
    <a> 
    <b>12</b> 
    <c>a</c> 
    <c>c</c> 
    </a> 
</Root> 

XSLT:

<xsl:template match='b'> 
    <a> 
     <xsl:value-of select='.'/> 
    </a> 
</xsl:template> 

<xsl:template match='c'> 
    <can>abc</can> 
</xsl:template> 

<xsl:template match='/Root'> 
    <Root> 
     <!-- select all 'b' and 'c' elements within an 'a' element --> 
     <xsl:apply-templates select='a/b | a/c'/> 
    </Root> 
</xsl:template> 

輸出:

<Root> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
    <can>abc</can> 
    <a>12</a> 
    <can>abc</can> 
    <can>abc</can> 
</Root>