2013-06-29 89 views
0

以下是示例XML:通過節點XSLT蟒蛇循環

<root> 
    <slide name="abc.xml" nav_info="foo" nav_lvl_1="foobar" nav_lvl_2="foobarz"> 
     <title>a</title> 
     <Introduction> 
      <para>b</para> 
     </Introduction> 
     <Text> 
      <header>c</header> 
      <para>d</para> 
      <header>e</header> 
      <para>f</para> 
      <header>g</header> 
      <para>h</para> 
     </Text> 
     <Statement> 
      <para>i</para> 
     </Statement> 
    </slide> 
</root> 

我必須使用XSLT來獲取每個節點的文字...我沒有得到節點title的文本的任何問題, statement但是,當我嘗試循環節點文本時,我只得到第一個headerpara。爲了更好地理解,我正在做什麼!

<xsl:choose> 
    <xsl:when test="@nav_info='foo'"> 
     <xsl:for-each select="Text"> 
      <xsl:if test="header"> 
        <xsl:value-of select="header"> 
      </xsl:if 
      <xsl:if test="para"> 
        <xsl:value-of select="para"> 
      </xsl:if 
     </xsl:for-each> 
    </xsl:when> 
</xsl:choose> 

Thsi給中小企業的輸出:

cd 預計輸出...

c d e f g h 

在order..Any建議請! 謝謝

回答

2

因爲您使用的是XSLT 1.0,所以<xsl:value-of select="header"/>只返回第一個值。

您可能只需要做到以下幾點,通過<Text>所有的孩子走:

<xsl:when test="@nav_info='foo'"> 
    <xsl:for-each select="Text/*"> 
     <xsl:value-of select="."> 
    </xsl:for-each> 
</xsl:when> 

有沒有需要檢查的單個元素。

如果有比那些名爲<header><para>其他元素的風險,然後使用:

<xsl:when test="@nav_info='foo'"> 
    <xsl:for-each select="Text/header | Text/para"> 
     <xsl:value-of select="."> 
    </xsl:for-each> 
</xsl:when> 

工會構建|將確保您的節點在文檔順序處理。

+0

謝謝霍爾曼先生..我同意上面的...我有一個擴展問題。如你所說,我需要通過孩子,但是,我必須理清輸出,即在真正的執行我的代碼我必須在轉換過程中將頭和段的值寫入不同的節點。我必須一次檢查一個條件..就像它是'文本/頭'做些事情,或者如果它是'文本/段'做一些事情..我如何在xslt中實現這個? – Sangamesh

+0

然後你不會使用'',而是可以用''替換'並且爲了處理每一個的存在並在輸出中構建你需要的節點,有''和''。 –

+0

工作非常感謝你! – Sangamesh