XSL:如果测试不按预期工作

时间:2014-09-27 20:54:15

标签: html xml xslt xhtml

   <xsl:for-each select="class/student">
         ID:   <xsl:value-of select="id"/><br/>
           Name:  <xsl:value-of select="lastName"/>,<xsl:value-of select="firstName"/><br/>
          Date:  <xsl:value-of select="date"/><br/>
           Major: <xsl:if test="major[@Year > 2008]"> 
                    <xsl:value-of select="major"/> ,
                     declared in:  <xsl:value-of select="major[@Year]"/>    
                  </xsl:if><br/><br/>
          </xsl:for-each>

XML code`:

     <student>
    <id>1000001</id>
    <lastName>john</lastName>
    <firstName>Doe</firstName>
    <date format="d">08/25/2006</date>
    <major Year="2006">CS:BS</major>
  </student>

输出:

ID: 1000001
 Name: Doe,John
 Date-enrolled: August 25, 2006
 Major: CS:BS , declared in: CS:BS

上面的xml代码只是实际xml代码的一个示例,还有更多'Year'值/元素。

大家好,

我试图只获得年份大于2008年的专业,因为某些原因我得错了输出。

感谢

2 个答案:

答案 0 :(得分:0)

你说“有更多'年'价值/元素”比显示的更多,这可能是问题的关键。如果您的输入包含两个元素

<major Year="2006">CS:BS</major>
<major Year="2009">CS:BS</major>

然后test="major/@Year > 2008"将返回true,因为有一个这样的元素,并且在XSLT 1.0中,<xsl:value-of select="major"/>将输出第一个选定的元素(在2.0中它将引发错误)。

将来,请尝试提供完整的样本样式表和源文档,以便其他人重现问题。如果您试图将其剪切而不测试缩减版本是否存在问题,则很容易消除作为故障实际来源的功能。

答案 1 :(得分:0)

问题是你正在倒退这个问题。您需要选择您想要的东西,然后使用它。您正在检查您想要的东西是否存在,然后使用不太具体的东西。

这可以解决您的问题:

Major: 
<xsl:for-each select="major[@Year > 2008]">
  <br/>
  <xsl:value-of select="."/>, declared in: <xsl:value-of select="@Year"/>
</xsl:for-each>
<br/>

您使用

<xsl:value-of select="major[@Year]"/>

也不正确。以下实际上会输出年份值:

<xsl:value-of select="major/@Year"/>

我强烈建议您使用<xsl:text><xsl:value-of>作为静态文本。您当前在整个XSLT中散布文本的方法导致了非常混乱的XSLT代码:

<xsl:for-each select="class/student">
  <xsl:value-of select="concat('ID: ', id)"/>
  <br/>
  <xsl:value-of select="concat('Name: ', lastName, ',', firstName)"/>
  <br/>
  <xsl:value-of select="concat('Date: ', date)"/>
  <br/>
  <xsl:text>Major:</xsl:text>
  <xsl:for-each select="major[@Year > 2008]">
    <br/>
    <xsl:value-of select="concat(., ', declared in: ', @Year)"/>
  </xsl:for-each>
  <br/>
</xsl:for-each>