2011-11-04 116 views
1

我看起来像一个XML文件:XSLT:for-each for for-each not working?

<VersionHistory> 
    <Release Version="0.0.1" Date="27/1/2011"> 
    <NewFeature>foo</NewFeature> 
    <BugFix>some text</BugFix> 
    <BugFix>some text</BugFix> 
    <BugFix Ticket="12004">some text</BugFix> 
    </Release> 
    <Release Version="0.0.2" Date="15/2/2011"> 
    <NewFeature>foobar</NewFeature> 
    <BugFix>some more text</BugFix> 
    <BugFix>some more text</BugFix> 
    <BugFix Ticket="12001">some more text</BugFix> 
    </Release> 
</VersionHistory> 

现在我的XSLT是这样的:

<xsl:template match="/"> 
    <xsl:for-each select="VersionHistory/Release"> 
     <xsl:sort select="@Version"/> 
    <ul> 
     <li> 
      <h3>New Feature<br/></h3> 
      <xsl:for-each select="NewFeature"> 
      <ul> 
       <li> 
       <xsl:value-of select="NewFeature"/> 
       </li> 
      </ul> 
      </xsl:for-each> 
     </li> 
     <h3> 
      Fixed<br/> 
      </h3> 
      <xsl:for-each select="BugFix"> 
       <ul> 
       <li> 
        <p> 
        <xsl:value-of select="BugFix"/> 
        </p> 
       </li> 
       </ul> 
      </xsl:for-each> 
     </li> 
... 

我的问题是,它经过了错误修正的for-each第二创建列表项目的XML包含这个元素..但我没有得到之间的文本。为什么? 我该如何解决这个问题?

这不仅是当然的bug修正..它的这一切元素,如修正错误,NewFeature(有一些更多的..我这里就不一一列举)

迎接

+1

不要使用'for-each' - 使用模板。 – Oded

+0

每个版本可以有多个新版本吗? – Remy

+0

是的,可以有多个 – darkdog

回答

5

在你for-each你选择NewFeature,然后在value-of,您呼叫称为NewFeature一个子节点的价值:

 <xsl:for-each select="NewFeature"> 
     <ul> 
      <li> 
      <xsl:value-of select="NewFeature"/> 
      </li> 
     </ul> 
     </xsl:for-each> 

由于NewFeature不包含包含 a NewFeature节点,您什么都看不到。

这会工作(选择在for-each回路当前节点):

 <xsl:for-each select="NewFeature"> 
     <ul> 
      <li> 
      <xsl:value-of select="."/> 
      </li> 
     </ul> 
     </xsl:for-each> 

但更好的选择是使用一个模板(你应该与所有for-each循环到):

<xsl:template match="NewFeature"> 
    <ul> 
    <li><xsl:value-of select="."/></li> 
    </ul> 
</xsl:template> 
+0

谢谢。对我来说工作正常 – darkdog