2011-06-28 44 views
1

我有這個xml與3個節點相同的名稱<person>。的問題是,它們中的2是一個父節點<people>下,另一種是根據另一<people>節點,所以當循環XSL它得到僅第一2.Xsl xml循環問題

XML:

XSL循環:

<xsl:for-each select="//person"> 

有人知道我需要做什麼才能看到他們所有3個?

謝謝。

回答

1

不是一個xsl-foreach一個更好的辦法是使用該人節點相匹配的模板:

<xsl:template match="/"> 
    <!-- match any person element that is a descendant of the root --> 
    <xsl:apply-templates select="//person"/> 
</xsl:template> 

<xsl:template match="person"> 
    <!-- transform the person element here --> 
</xsl:template match="person"> 
+0

爲什麼它比xsl-foreach更好? –

+0

適合我的新方法。你能解釋更多嗎? –

+0

apply-templates選擇一個節點集並搜索要應用的模板。模板定義指示如何轉換匹配「匹配」XPath的元素。這使您可以編寫更鬆散耦合的模板。這有點像在C#中將複雜的方法分解爲許多單獨的方法。它促進重複使用,例如,在上面的示例中轉換人員的模板可以用於許多不同的環境中。如果它是for-each循環內的硬編碼,則不能重新使用。 – ColinE

3

使用可以使用這個模板,xsl:for-each

<xsl:template match="data"> 
    <root> 
     <xsl:for-each select="//person"> 
      <item> 
       <xsl:value-of select="name(.)"/> 
      </item> 
     </xsl:for-each> 
    </root> 
</xsl:template> 
+0

非常感謝。我感謝您的幫助。 –

+0

@ user181421,不客氣! –

1

中的XPath:

//person 

選擇所有人物元素無論在哪裏y位於XML輸入中(請參閱here)。

的XSLT指令:

<xsl:for-each select="//person"> 

將迭代通過了XPath選擇的所有的人的元素。無論你使用這個指令的背景是什麼,變換都應該迭代所有三個人的元素。這不是像真正的情況下(給出你的問題提供的樣本輸入):

<xsl:template match="/data/people[1]"> 
    <xsl:for-each select=".//person"> 
     <xsl:value-of select="name(.)"/> 
    </xsl:for-each> 
</xsl:template> 

你在哪裏明確地選擇從一個特定的背景下開始的所有的人的元素。在這種情況下,我認爲,僅在這種情況下,您只會對前兩個元素進行迭代。

因此在測試中有些奇怪的東西。