0

次のスニペットがあります

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

コンマで区切られた本のタイトルのリストにしたい。

リストに本がない場合、出力は正しいです。複数の本を持っている場合も正しいです。

ただし、本が 1 冊だけある場合は、最後にカンマが出力されます。
最後の要素の場合のみコンマを出力するように条件を変更すると、ブックが 1 つしかない場合にカンマが出力されません。

そのため、要素が1つしかない場合、最後の要素として扱われないようです。どうすればこれに対処できますか?

サンプル XML: 次のようになります。

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

リストに2冊の本がある場合、

My book, Another book

2番目のエントリを削除すると、

My book,

編集:

問題が見つかりました。を使用し<xsl:apply-templates>て一連のデータを選択し、各書籍の別のテンプレート内で位置チェックを行っていました。ただし、last()フィルタリングされたサブセットではなく、元のデータ セットを参照していました。

4

2 に答える 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>
于 2012-10-02T18:57:45.967 に答える
0

「test()」とは?「last()-1」が必要だと思います。

于 2012-10-02T18:29:52.017 に答える