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,

编辑:

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

4

2 回答 2

0

什么是“测试()”?我想你想要“last()-1”。

于 2012-10-02T18:29:52.017 回答
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>
于 2012-10-02T18:57:45.967 回答