1

私の xsl ファイルでは、別の xml ドキュメント (変換しているメインの xml ドキュメントの横) を文字列パラメーター (param) として受け取ります。

私のパラメータ名はseconddocだと言う

<xsl:param name="seconddoc"></xsl:param>

そしてparam値は次のとおりです(繰り返しますが、すべてを文字列として取得しています)

<products>
    <product>
        <id>1</id>
        <name>pro-1</name>
    </product>
    <product>
        <id>2</id>
        <name>pro-2</name>
    </product>
    <product>
        <id>3</id>
        <name>pro-3</name>
    </product>
</products>

次のように文字列全体を印刷できます

<xsl:value-of select="$seconddoc" />

しかし、値全体を一度に取得するのではなく、データ (文字列) を反復処理したいと考えています。私の最終目標は、このデータを選択オプションにロードすることです。

私は次のように疲れました:

<select>
    <xsl:for-each select="$seconddoc/products/product">
        <option value="{id}">
            <xsl:value-of select="name" /></option>
    </xsl:for-each>
</select>

しかし、私はTransformerExceptionを取得しています。「'java.lang.String' から 'node-set' への変換が無効です。

アップデート:

これは私のjspページにあるものです

<x:transform xml="${mainxmldoc}" xslt="${xslt}">
<x:param name="seconddoc" value="<%=xmlString %>"/>
</x:transform>
4

3 に答える 3

3

XalanのバージョンであるJDKに付属している組み込みのXSLT1.0プロセッサを使用している可能性があります。XSLT 1.0または2.0には、XMLパーサーを呼び出す標準的な方法はありません(これは、文字列をノードに変換するために必要なことです)。変換の外部で変換を実行する(ノードをパラメーターとして渡す)か、ジョブを実行する拡張機能を使用する必要があります。Xalanのexslt:node-set()の実装がこれを行う可能性があることを覚えているようです。見てみな。あるいは、Javaの世界にいるので、XSLT 2.0(Saxonを意味する)にアップグレードすると、多くのことがはるかに簡単になります。SaxonがJSPでどれだけうまく機能するかはわかりません(確かに実行できますが、x:transformタグライブラリを使用できるかどうかはわかりません)。Saxonにはsaxon:parse拡張関数があります。これはドラフト3にあります。

于 2013-01-31T06:25:51.293 に答える
3

パラメータをノードセットに変換できないようです。しかし、変数はできます!だから私はそれを解決した方法。

まず、変数を宣言し、パラメーター値を変数に入れます。次に、変数をノードセットに変換します。これで、ノードセットを反復できます

ここに完全なコードがあります

<xsl:variable name="stringVar">
        <xsl:value-of select="$seconddoc" />
    </xsl:variable>

    <xsl:template match="/">
        <xsl:for-each select="exslt:node-set($stringVar)/node()">
            <select>
                <xsl:for-each select="/products/product">
                    <option value="{id}">
                        <xsl:value-of select="name" />
                    </option>

                </xsl:for-each>
            </select>
        </xsl:for-each>
    </xsl:template>
于 2013-01-31T17:39:31.540 に答える
2

タグを使用<x:parse>すると、コンテンツを次のように処理できます。

<x:parse var="doc">
    <products>
        <product>
            <id>1</id>
            <name>pro-1</name>
        </product>
        <product>
            <id>2</id>
            <name>pro-2</name>
        </product>
        <product>
            <id>3</id>
            <name>pro-3</name>
        </product>
    </products>
</x:parse>

次に、XPath を使用して目的のノードをターゲットにします。

<x:out select="$doc/products/product/..." />
于 2013-01-31T03:24:19.920 に答える