2016-10-25 90 views
1

我們輸入文檔,描述樹的結構XSLT遞歸:的樹生成

<?xml version="1.0"?> 
<html> 
<mas> 
    <row> <col>2</col><col>4</col> </row> 
    <row> <col>3</col> </row> 
    <row> <col></col> </row> 
    <row> <col>5</col><col>6</col> </row> 
    <row> <col></col> </row> 
    <row> <col></col> </row> 
</mas> 
</html> 

我們要創建一個樹。 我們要輸出的文件是這樣的:

<Transform id="b_1"> 
<Transform id="b_2"> 
    <Transform id="b_3"/> 
</Transform> 
<Transform id="b_4"> 
    <Transform id="b_5"/> 
    <Transform id="b_6"/> 
</Transform> 
</Transform> 

我有XSLT樣式表:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> 
<xsl:template name="vetka"> 
<xsl:param name="row"/> 
<xsl:for-each select="html/mas/*[$row]/*" > 
    <xsl:variable name="col" select="position()"/> 
    <xsl:variable name="num" select="//html/mas/*[$row]/*[$col]"/> 
    <Transform> 
    <xsl:attribute name="id"><xsl:value-of select="concat('b_',$num)"/></xsl:attribute> 
    <xsl:call-template name="vetka"> 
    <xsl:with-param name="row" select="$num"/> 
    </xsl:call-template> 
    </Transform> 
</xsl:for-each> 
</xsl:template> 
<xsl:template match="/"> 
<xsl:result-document href="str.txt"> 
    <xsl:call-template name="vetka"> 
    <xsl:with-param name="row" select='1'/> 
    </xsl:call-template> 
</xsl:result-document> 
</xsl:template> 
</xsl:stylesheet> 

但我們得到兩個( 「B_2」, 「B_4」)。我認爲,遞歸不是開始。爲什麼?

+0

這與您的其他問題有什麼不同:http://stackoverflow.com/questions/40232243/how-do-i-use-xslt-to-add-a-new-element-in-output-document? –

+0

這是關於遞歸。這不是開始( – goshanoob

回答

0

的主要問題是這條線......

<xsl:for-each select="html/mas/*[$row]/*" > 

這工作第一次,因爲你定位在文檔elememt /。但是,當您遞歸調用模板時,您現在位於col元素上,並且此xsl:for-each將查找名爲html的子元素。所以,你應該把它改成這樣:

<xsl:for-each select="/html/mas/*[$row]/*" /> 

此外,當您遞歸調用模板,將row參數需要被設置爲一個數字。目前它是一個字符串(恰好包含數字的字符串)。

試試這個XSLT,我已經簡化了一下(因爲你num變量實際上是當前col元素只值)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes" /> 

<xsl:template name="vetka"> 
<xsl:param name="row"/> 
<xsl:for-each select="//html/mas/*[$row]/*[. != '']" > 
    <xsl:variable name="num" select="."/> 
    <Transform id="{concat('b_',$num)}"> 
    <xsl:call-template name="vetka"> 
    <xsl:with-param name="row" select="number($num)"/> 
    </xsl:call-template> 
    </Transform> 
</xsl:for-each> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:call-template name="vetka"> 
    <xsl:with-param name="row" select='1'/> 
    </xsl:call-template> 
</xsl:template> 
</xsl:stylesheet> 

這並不完全產生你想要的輸出,但我找不到你的b_1來自哪裏。