1

xsl変換でxml出力を区切る最良の方法を知りたいです。「position()!= last()」は、入力についての仮定を行うため、常に機能するとは限りません。

このおもちゃの例は、次のことを示しています。

  <xsl:template match="/">
    <html>
      <body>
        <xsl:for-each select="//cd">
          <xsl:if test="title !='Unchain my heart'">
            <xsl:value-of select="title" />
            <xsl:if test="position() != last()">
              <xsl:text>; </xsl:text>  <!-- sometimes the delimiter will end if last element is a duplicate; -->
            </xsl:if>
          </xsl:if>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>

結果として

... Pavarotti Gala Concert; The dock of the bay; Picture book; Red; 

末尾のセミコロンに注意してください。

何か案は?

(この例のxmlデータhttp://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog

4

3 に答える 3

2

できることの1つは、following::軸を使用して、最後のタイトルにいるかどうかを確認することです。

例:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:apply-templates select="catalog/cd/title[. != 'Unchain my heart']"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="title">
        <xsl:value-of select="."/>
        <xsl:if test="following::cd/title[. != 'Unchain my heart']">
            <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

xsl:for-eachあなたがそれを保持したいのであれば、あなたはまだあなたの中でそれを使うことができます。

また、XSLT 2.0を使用している場合は、のseparator属性を使用できますxsl:value-of

例:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <html>
            <body>
                <xsl:value-of select="catalog/cd/title[. != 'Unchain my heart']" separator="; "/>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

また、「Unchain my heart」というタイトルを削除しようとしている場合は、代わりに述語に入れてみてくださいxsl:if(間違いではなく、効率が悪く、同じことを行うためのコードがたくさんあります)。

例:

//cd[title != 'Unchain my heart']

また

title[. != 'Unchain my heart']
于 2012-06-08T19:47:58.943 に答える
2

次のように変更します。

    <xsl:for-each select="//cd[title !='Unchain my heart']">
        <xsl:value-of select="title" />
        <xsl:if test="position() != last()">
          <xsl:text>; </xsl:text>
        </xsl:if>
    </xsl:for-each>

またはXSLT2.0では、

<xsl:value-of select="//cd/title[. !='Unchain my heart']" separator="; "/>
于 2012-06-08T22:25:31.307 に答える
0

1つの方法は、XMLを準備スイープして、より良い構造にパイプライン化することです。

ここでの概念は、独自のXMLを作成し、それをノードセット(ソースXMLとは別)として評価することです。これは、EXSLTのnode-set()方法によって実現されます。

このXMLPlaygroundセッションをノックアップしました。お役に立てば幸いです。ご覧のとおり、末尾にコロンはありません。

http://www.xmlplayground.com/054Mj7

于 2012-06-08T18:51:03.687 に答える