1

グーグルで答えを探してみましたが、返される結果は、文字列を置き換える方法か、部分文字列を置き換える方法などです。しかし、私の質問は少し異なります。

「data/records / record」を処理する既存のXSLテンプレート、たとえば「hello-world 」があるが、 hello-worldを変更できないため、データをマッサージ/変更するラッパーテンプレートを作成することを考えています。hello-worldに渡す前に各レコード内に...それを行う方法はありますか?

これまで、重複レコードを除外する関数を作成してきましたが、「data / records/*」内のすべてのレコードを新しいものに置き換えることを考えていました...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">


    <xsl:template match="/">
        <xsl:call-template name="get-unique-record">
            <xsl:with-param name="records" select="/data/records/record"/>
        </xsl:call-template>
    </xsl:template>

    <!-- This function will filter out the given records and return a unique set of records -->
    <xsl:key name="kField_ID" match="field[@name='ID']" use="."/>
    <xsl:template name="get-unique-record">
        <xsl:param name="records"/>
        <xsl:for-each select="$records">
            <xsl:variable name="record" select="."/>
            <xsl:if test="$record//field[generate-id() = generate-id(key('kField_ID', .))]">
            <xsl:copy-of select="$record"/>         
            </xsl:if>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

今...次のようなことを行うことは可能ですか?

<xsl:variable name="/data/records/record">
    <xsl:call-template name="get-unique-record">
        <xsl:with-param name="records" select="/data/records/record"/>
    </xsl:call-template>
</xsl:variable>

編集:@LasrH、迅速な返信をありがとう。既存の「/」のコピーを作成してから、すべての/ data / records / recordをフィルター処理されたものに置き換える方法はありますか?

EDIT2:@LasrH、「データ」ノードを変更および再構築するためのテンプレートをいくつか作成しました。node-setを使用して、既存の入力を入力としての新しいデータに「置き換える」ことはできますか?

<xsl:variable name="data">
    <xsl:call-template name="rebuild-data-with-record">
        <xsl:with-param name="records">
                    <xsl:copy-of select="$unique-records"></xsl:copy-of>
                    </xsl:with-param>
    </xsl:call-template>
</xsl:variable>

次に、さらに下の方で、次のようなノードセットを使用しようとしました。

<xsl:apply-templates select="exslt:node-set($data)/data"/>

しかし、それを実行しているようには見えません...エラーもスローされません。

4

2 に答える 2

1

いいえ、XSLではソースドキュメントをインプレースで変更することはできません。

ただし、元のソースドキュメントをアップストリームでマッサージし(別のXSLスタイルシートを使用)、元のソースドキュメントを処理させる代わりに、マッサージしたドキュメントを「hello-world」テンプレートを呼び出すXSLスタイルシートに渡すことができます。

そのスタイルシートを変更できる場合は、「hello-world」を含む同じスタイルシート内でこれを行うこともできます。(ただし、そのスタイルシートを変更することはできないと思います。そうしないと、「hello-world」を変更できるようになります。)

于 2012-07-17T21:00:53.893 に答える
1

実際、多くの調査と試行を経て、XSLレベルでデータを「置換/置換」することができます!!! ルートノードを自分で再構築し、「変更されたルート」(RTFがノードセットにキャストバック)をテンプレートに渡し、代わりにテンプレートに自分のデータから読み取らせる必要があります!!!

ここで別の質問をしました。これは、これを機能させるための実験の一部 でした。XRTreeFragからXNodeSetにキャストできません。

アイデアはこれです、あなたは入ってくるデータを読み取る/処理するテンプレート関数を持っています、そして私たちはほとんど常にルートから入力を読み取ります/ blah / blah / blah ...ルートからそれを読み取るのではなく、あなたはすることができますこれは、テンプレートのすべて/いずれかに含まれます。

<xsl:template name="helloworld">
    <xsl:param name="inputRoot" select="/"/>
    <xsl:variable name="root" select="$inputRoot"/>
    rest of your code goes here...

ここで、すべてのルートアクセスを$ root / blah / blah / blahに置き換えると、変更されたXSLデータが取り込まれます。

これのすばらしい点は、入力データを渡さない場合、入力がルートであると想定することです。;)

これはテストされ、問題なく動作しました。私が懸念していることは1つだけですが、XSL入力が巨大な場合、ルート全体を再構築するとパフォーマンスの問題が発生する可能性があります。しかし、私の入力はわずか20レコードであり、私の場合、パフォーマンスへの影響はありませんでした。

したがって、入力データが大きいかどうかを再確認することをお勧めします。

このソリューション/メソッドはXSL1.0に対応しています。

于 2012-08-03T14:33:07.233 に答える