2013-06-23 176 views
0

我的XML的簡化結構:XSL每個迭代一次

<CV> 
    <info> 
    <firstname>Sam</firstname> 
    <lastname>Smith</lastname> 
    <birthday>19/08/1978</birthday> 
    </info> 

    <additions> 
    <name>japan language course</name> 
    <name>skipper course</name> 
    </additions> 

    <interests> 
    <name>cycling</name> 
    <name>runing</name> 
    <name>surfing</name> 
    </interests> 
</CV> 

我有一個問題,使用XSL iteratations的for-each增量和興趣:

<xsl:for-each select="/CV/additions"> 
    <xsl:value-of select="name"/> 
</xsl:for-each> 

這表明我只有「日語語言課程」和「自行車」。

結構是否有可能不正確?解決我的問題最簡單的方法是改變:

<interests> 
    <name>cycling</name> 
    <name>runing</name> 
    <name>surfing</name> 
    </interests> 

到:

<interests> 
    <interest> 
     <name>cycling</name> 
    </interest> 
    <interest> 
     <name>runing</name> 
    </interest> 
    <interest> 
     <name>surfing</name> 
    </interest> 
    </interests> 

,但我認爲這是相當愚蠢的,以創建子孩子的...

問候

回答

1

您已經找到了解決方案,但是就解釋而言...

xsl:for-each遍歷XPath選擇的所有節點。在您的初始嘗試中,路徑/CV/additions僅匹配一個節點,因此它只會迭代一次。在您的解決方案中,您使用了路徑/CV/additions/name,該路徑選擇全部三個name元素並遍歷它們。

值得一提的是,使用xsl:for-each往往是望而卻步,贊成的模板,但路徑的處理這裏的工作原理相同:

<xsl:template match="/"> 
    <xsl:apply-templates select="/CV/additions/name" /> 
    <xsl:apply-templates select="/CV/interests/name" /> 
</xsl:template> 

<xsl:template match="additions/name"> 
    <xsl:value-of select="concat('Addition: ', ., '&#xA;')" /> 
</xsl:template> 

<xsl:template match="interests/name"> 
    <xsl:value-of select="concat('Interest: ', ., '&#xA;')" /> 
</xsl:template> 
0

通過反覆試驗找到解決方案:

<xsl:for-each select="/CV/additions/name"> 
    <xsl:value-of select="."/> 
</xsl:for-each> 
0

解釋的另一部分是純粹的心理。英語中的「增補」一詞是複數名詞,所以你被誤解爲當你選擇它時,你選擇了幾件事情。我相信如果這個元素被命名爲「增加」,你就不會犯這個錯誤。