2009-07-24 107 views
0

我遇到了XSL變量的問題。 我知道一旦宣佈,變量的值不能改變。更改xsl中的變量值

但是我正面臨着一個相當奇怪的問題,我無法改變XML輸出,而是弄清楚它是否可以用XSL本身。

我正在使用xsl:for-each來遍歷XML中的一些數據。

繞環可以是三種類型的數據,說的Type1和Type2和類型3

如果是Type1,我打電話模板來處理這些數據。在模板內部,我正在顯示一個標題。我第一次只遇到這個Type1數據時需要打印這個頭文件。之後,我不需要顯示這一點。

我可能已經傳遞了一個參數以及調用模板並設置/取消設置以確定是否需要打印標題文本。但據我瞭解,作爲一種格式化語言,變量狀態不會被保留。

你可以請提供你的寶貴建議,如何實現這個(可能沒有XML更改)?

編輯:

測試將通過帕特里斯提到的XML輸出工作。但我的XML是不同的。

<doc> 
<item>foobar</item> 
<item>foo</item> 
<item>bar</item> 
<item>baz</item> 
<item>foo</item> 
<item>bar</item> 
</doc> 

從這個XML,我第一次遇到'foo'需要顯示一個頭。項目的順序可以是任何東西。我無法準確預測'foo'何時會出現在XML中。

你能提出一些建議嗎?

+0

更換帕特里斯的標籤請發表你的一些代碼,所以我們可以提供幫助。 – 2009-07-24 15:25:14

回答

3

您可以使用適當的選擇器(對於您的某些實際代碼會更容易)。

實例與該輸入:

<doc> 
    <item>foo</item> 
    <item>bar</item> 
</doc> 

您可以使用此XSLT:

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> 
<xsl:output method='html' version='1.0' encoding='utf-8' indent='yes'/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="/doc/item" /> 
    </xsl:template> 

    <xsl:template match="item"> 
     <xsl:if test="not(preceding-sibling::item)"> 
      <h1>First</h1> 
     </xsl:if> 
     <p><xsl:apply-templates /></p> 
    </xsl:template> 

</xsl:stylesheet> 

,你會得到這樣的輸出:

<h1>First</h1> 
<p>foo</p> 
<p>bar</p> 

他們關鍵是測試

<xsl:if test="not(preceding-sibling::item)"> 

你也可以改變,要

<xsl:if test="not(preceding::item)"> 

取決於你的文檔結構。

有關更多詳細信息,請參閱XPath axes

+0

我也用過(position()= 1),但我更喜歡你的解決方案,因爲它更好地解釋了測試。 – Ishmael 2009-07-24 15:47:31

+0

+1如果在前面的兄弟姐妹是我會在這裏,這樣或那樣的 – annakata 2009-07-25 21:57:21

0

你可能只需要添加一個謂詞,但是又沒有輸入的具體例子和預期輸出的細節,很難說清楚。

的第一個項目,其內容是「富」,與

<xsl:if test=".='foo' and not(preceding-sibling::item[.='foo'])">