首页 文章

只有xslt结果集中的元素不是最后一个元素?

提问于
浏览
0

我有以下片段

<xsl:for-each select="book">
  <xsl:value-of select="title"/><xsl:if test="position() != last()">,</xsl:if>
</xsl:for-each>

我希望它是一个以逗号分隔的书名列表 .

当列表中没有书籍时输出正确 . 当我有一本以上的书时,它也是正确的 .

但是,如果我只有一本书,它会在最后打印一个逗号 .
当我将条件更改为仅打印逗号(如果它是最后一个元素)时,只有一本书的情况不会打印逗号 .

因此,当只有一个元素时,它似乎不被视为最后一个元素 . 我怎么处理这个?

示例XML:看起来像这样

<booklist>
  <book>
    <title>My book</title>
    <author>Some author</author>
  </book>
  <book>
    <title>Another book</title>
    <author>Another author</author>
  </book>
</booklist>

当列表中有两本书时,我明白了

My book, Another book

当我删除第二个条目时,我明白了

My book,

编辑:

我发现了这个问题 . 我正在使用 <xsl:apply-templates> 来选择一组数据,然后在每本书的另一个模板中,我正在进行位置检查 . 但是, last() 指的是原始数据集而不是过滤后的子集 .

2 回答

  • 0

    以下在Firefox中对我来说很好(我没有书没有逗号,如果n> 0,n书没有n-1个逗号) . 我怀疑你的XSLT处理器坏了 .

    XSLT(“x.xsl”):

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="html" indent="yes" encoding="iso-8859-1" media-type="text/xhtml" doctype-public="-//W3C//DTD HTML 4.0//EN"/>
      <xsl:template match="/">
        <xsl:for-each select="root/book">
          <xsl:value-of select="title"/><xsl:if test="position() != last()">;</xsl:if>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    

    XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet href="x.xsl" type="text/xsl"?>
    <root>
      <book>
        <title>A</title>
      </book>
      <book>
        <title>B</title>
      </book>
    </root>
    
  • 0

    什么是“test()”?我想你想要“last() - 1” .

相关问题