2015-01-26 55 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