-2

それは私が必要としているということをより明確にするものです..

質問に対するこの回答によると、XSLT変数は安価です! 私の質問は次のとおりです。このステートメントはすべてのシナリオで有効ですか? 4行のコードで作成および破棄されるインスタント変数は面倒ではありませんが、ルートノードまたは子エンティティをロードすることは、私の意見では確かに悪い習慣です..

同じ入力と出力の要件向けに設計された 2 つの XSLT ファイルがあります。

XSLT1 (不要な変数なし):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <Collection>
            <xsl:for-each select="CATALOG/CD">
                <DVD>
                    <Cover>
                        <xsl:value-of select="string(TITLE)"/>
                    </Cover>
                    <Author>
                        <xsl:value-of select="string(ARTIST)"/>
                    </Author>
                    <BelongsTo>
                        <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/>
                    </BelongsTo>
                    <SponsoredBy>
                        <xsl:value-of select="string(COMPANY)"/>
                    </SponsoredBy>
                    <Price>
                        <xsl:value-of select="string(number(string(PRICE)))"/>
                    </Price>
                    <Year>
                        <xsl:value-of select="string(floor(number(string(YEAR))))"/>
                    </Year>
                </DVD>
            </xsl:for-each>
        </Collection>
    </xsl:template>
</xsl:stylesheet>

XSLT2 (XML 全体がロードされる不要な変数「root」を使用):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <xsl:variable name="root" select="."/>
        <Collection>
            <xsl:for-each select="$root/CATALOG/CD">
                <DVD>
                    <Cover>
                        <xsl:value-of select="string(TITLE)"/>
                    </Cover>
                    <Author>
                        <xsl:value-of select="string(ARTIST)"/>
                    </Author>
                    <BelongsTo>
                        <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/>
                    </BelongsTo>
                    <SponsoredBy>
                        <xsl:value-of select="string(COMPANY)"/>
                    </SponsoredBy>
                    <Price>
                        <xsl:value-of select="string(number(string(PRICE)))"/>
                    </Price>
                    <Year>
                        <xsl:value-of select="string(floor(number(string(YEAR))))"/>
                    </Year>
                </DVD>
            </xsl:for-each>
        </Collection>
    </xsl:template>
</xsl:stylesheet>

アプローチ 2 はリアルタイムで存在し、実際には XML は数 KB から数 MB になります。XSLT では、変数の使用は子エンティティにも拡張されます。
アプローチを変更するという私の提案を提示するには、背後にある理論を検証する必要があります。それ..

アプローチ 2 の場合の私の理解によると、システムは XML データをメモリに何度もリロードし (複数の変数を使用して子エンティティをロードする場合、状況は最悪になります)、それによって変換プロセスが遅くなります。

この質問をここに投稿する前に、タイマーを使用して 2 つの XSLT のパフォーマンスをテストしました。最初のアプローチは、アプローチ 2 よりも数ミリ秒短くなります。(システム キャッシュの複雑さを避けるために、copy-XML ファイルを使用して 2 つの XSL ファイルをテストしました)。しかし、ここでもシステムキャッシュが非常に紛らわしい役割を果たしている可能性があります..

私のこの分析にもかかわらず、私はまだ心に疑問を持っています! 本当に変数の使用を避ける必要がありますか? また、私のシステムに関する限り、'アプローチ-1' を使用するためにリアルタイム XSLT ファイルを変更する価値はありますか?

または、XSLT 変数が他のプログラミング言語とは異なるようなものですか (私が認識していない場合) .. たとえば、XSLT 変数は実際にはデータを保存するのではなくselect="."、データを指しているとします! またはこのようなもの..?したがって、ためらうことなく XSLT 変数を使用し続けます。

これについてあなたの提案は何ですか?

現在のシステムに関するクイック情報:

  1. ホスト プログラミング言語またはシステム: Siebel (C++ はバックエンド コードです)
  2. XSLT プロセッサ: Xalan (Saxon が明示的に使用されていない場合)
4

1 に答える 1

0

特定の XSLT プロセッサでパフォーマンスを測定する必要があるというコメントに同意します。

しかし、「アプローチ-2、システムがXMLデータをメモリに何度もリロードしている」などの説明や期待は、私には間違っているようです。<xsl:variable name="root" select="."/>いずれにせよ、XSLT プロセッサはプライマリ入力 XML ドキュメントの入力ツリーを構築しますが、実装がドキュメントを完全に再度ロードするようなことを行うとは想像できません。 . この変数は、既存の入力ツリーのドキュメント ノードへの参照を保持するだけです。

もちろん、単一の入力ドキュメントと、現在のノードがドキュメントである単一のテンプレートがあるサンプルでは、​​とにかく、変数の使用は不要です。ただし、特に複数のドキュメントを扱う場合など、プライマリ入力ドキュメントのドキュメント ノードを格納する必要がある場合があります。

于 2013-07-28T09:34:54.793 に答える