15

私が直面している問題は単純に思えますが、すべてのXSLの初心者であるため、適切な解決策をまだ見つけていません。私がやりたいことは、後で HTML 要素の属性の値として使用できるforeach要素ループの結果を連結して文字列を作成することです。

与えられた:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <country>UK</country>
        <company>CBS Records</company>
    </cd>
    <cd>
        <country>USA</country>
        <company>RCA</company>
    </cd>
    <cd>
        <country>UK</country>
        <company>Virgin records</company>
    </cd>
</catalog>

望ましい出力:CBS;RCA;Virgin records

上記の方法でこの変換を実行するXSLTコードの有効な部分が必要です。連結の結果と区切り文字を保持するxsl-variableが必要だと思います。これはどのように行うことができますか?ありがとうございました。<company>;

4

3 に答える 3

21

XSL 変数を使用して連結できるとは思えません。変数の値が設定されると、それを変更することはできないからです。代わりに、次のようなものが必要だと思います:

<xsl:for-each select="catalog/cd">
    <xsl:choose>
        <xsl:when test="position() = 1">
            <xsl:value-of select="country"/>
        </xsl:when>
        <xsl:otherwise>
            ;<xsl:value-of select="country"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

それはあなたにとって意味がありますか?

編集:変数の使用方法を読み間違えた可能性があることに気付きました。上に投稿したスニペットは、後で使用するために可変要素でラップできます。

<xsl:variable name="VariableName">
    <xsl:for-each select="catalog/cd">
        <xsl:choose>
            <xsl:when test="position() = 1">
                <xsl:value-of select="country"/>
            </xsl:when>
            <xsl:otherwise>
                ;<xsl:value-of select="country"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:variable>
于 2012-08-12T02:49:31.717 に答える
5

XSLT 2.0 を使用できる場合は、次のいずれかが機能します。

string-join()関数を使用します。

<xsl:variable name="companies" select="string-join(catalog/cd/company, ';')" />

@separatorで使用xsl:value-of:

<xsl:variable name="companies" >
   <xsl:value-of select="catalog/cd/company" separator=";" />
</xsl:variable>
于 2012-08-12T03:45:11.033 に答える
4

シンプルで真の XSLT ソリューションの 1 つを次に示します

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

 <xsl:template match="company">
  <xsl:value-of select="."/>
  <xsl:if test="following::company">;</xsl:if>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<catalog>
    <cd>
        <country>UK</country>
        <company>CBS Records</company>
    </cd>
    <cd>
        <country>USA</country>
        <company>RCA</company>
    </cd>
    <cd>
        <country>UK</country>
        <company>Virgin records</company>
    </cd>
</catalog>

必要な正しい結果 (すべての会社が連結され、 a で区切られている;) が生成されます。

CBS Records;RCA;Virgin records
于 2012-08-12T03:30:50.423 に答える