2015-01-26 74 views
1

我對XSLT比較陌生,並且發現前兄弟姐妹::很痛苦。選擇父母的前兄弟姐妹的ID

用一個非常簡單的示例XML:

<month> 
    <day id="1">Day one was a lovely day</day> 
    <day id="2">Day two was balls</day> 
    <day id="3">Day three was Wednesday</day> 
</month> 

和一些基本的XSLT(我想每天輸出到一個新的文件:這個沒問題):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/month"> 
     <xsl:for-each select="day"> 
      <xsl:result-document href="output/day-{@id}/index.html"> 
       <xsl:call-template name="page" /> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 


    <xsl:template name="page"> 
     <html> 
      <head> 
       <title>This is <xsl:value-of select="id" /></title> 
      </head> 
      <body> 
       <h1>Day of new <xsl:value-of select="@id" /></h1> 
       <p><xsl:value-of select="." /></p> 

       <!--PROBLEM HERE:: --> 
       Previous: <xsl:value-of select="" /> 

      </body> 
     </html> 
    </xsl:template>  
</xsl:stylesheet> 

問題我有最後一點(我在這裏寫過問題)。我正在嘗試獲取前一天的ID。我似乎無法獲得正確的select值。我試過ancestor::../preceding-sibling::day[1]的所有組合,我可以在任何地方找到。請幫忙!

+0

我還沒有檢查過這個代碼中是否有前一個節點,但是至少假設它在第2天和第3天都有效。 – user2672537 2015-01-26 18:33:03

+0

您不需要在本月進行匹配,因爲您正在處理的所有內容都是兒童,XSLT內置的模板規則會自動執行此操作。取消每天的for-each和模板匹配,而不是。此外,如果我是你,我會將被調用的模板放到日期模板中,以便清楚地知道該代碼的執行位置,並且不必知道它從何處被調用。現在可能很容易,但如果你有更大的樣式表則不會。 – 2015-01-26 20:35:46

回答

1

使用以下命令:

<xsl:value-of select="preceding-sibling::day[1]/@id"/> 

只是,第一個將沒有任何價值,因爲沒有前同輩day

+0

謝謝......出於某種原因,我正在假設這個是在一天的上下文中......而不是在該節點本身上運行。 – user2672537 2015-01-26 18:46:25

+1

@ user2672537如果解決了您的問題,請不要忘記[**接受此答案**](http://stackoverflow.com/help/someone-answers)。謝謝! – 2015-01-26 19:23:23