<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年的专业,因为某些原因我得错了输出。
感谢
答案 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>