在使用xsl:if和count()时不能写出元素

时间:2016-02-05 16:00:32

标签: xml xslt xpath

如果艺术家元素的总数大于x,我想写出所有艺术家元素。我有以下xml:

<catalog>
<cd>
    <title>Empire Burlesque</title>
</cd>
<cd>
    <title>Hide your heart</title>
    <artist scale="28">Bonnie Tyler</artist>
</cd>
<cd>
    <title>Greatest Hits</title>
    <artist scale="30">Dolly Parton</artist>
</cd>
<cd>
    <title>Still got the blues</title>
    <artist scale="24">Gary Moore</artist>
</cd>

我在xsl中有以下内容:

 <xsl:for-each select="/">
  <xsl:if test="count(catalog/cd/artist) &gt; 26">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
  </xsl:if>
</xsl:for-each>

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的XSLT代码中存在多个错误:

  • 在select-expression
  • 中使用titles代替title
  • 您正在检查大于26的计数,但您的示例XML只有三个条目
  • 您在xsl:for-each中选择了根节点,但尝试使用xsl:value-of
  • 访问两个级别的子节点

这是一个满足您要求的样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:template match="/catalog">
  <xsl:if test="count(cd) > 2">
   <xsl:for-each select="cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
   </xsl:for-each>
  </xsl:if>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

  

我做错了什么?

首先,这个:

<xsl:for-each select="/">

将您置于根节点的上下文中。从这个上下文,指令:

<xsl:value-of select="artist"/>

不返回任何内容,因为当前节点没有artist子节点。即使它有,只返回第一个的值(在XSLT 1.0中)。如果要将它们作为单个表行/单元格写出,则需要使用xsl:for-eachxsl:apply-templates来处理后代节点。

至于:

<xsl:value-of select="titles"/>

输入中根本没有这样的节点