0

私は XSLT をごく短期間しか使用していませんが、概念的な質問があります。

XML ファイルがあります。

<?xml version="1.0"?>
<root>AAA - BBB</root>

および XSLT ファイル

<xsl:output method="text"/>

<xsl:param name="DATA" select="999"/>

<lookup:strings>
    <string id='eee'>XXX</string>
    <string id='fff'>YYY</string>
</lookup:strings>

<xsl:key name='look' match='lookup:strings/string' use='@id' />

<xsl:variable name='strings' select='document("")//lookup:strings' />

<xsl:template match="/">
    <xsl:text>$strings=</xsl:text>
    <xsl:value-of select="$strings"/>
    <xsl:text>&#xa;</xsl:text>
    <xsl:text>(A)</xsl:text>
    <xsl:for-each select='$strings'>
        <xsl:value-of select='key("look", "eee")'/>
    </xsl:for-each>
    <xsl:text>(B)</xsl:text>
    <xsl:value-of select='key("look", "eee")'/>
    <xsl:text>(C)</xsl:text>
    <xsl:value-of select="substring-before(.,' - ')"/>
    <xsl:text>(D)</xsl:text>
    <xsl:value-of select="$DATA"/>
</xsl:template>

これにより、次の出力が生成されます。

$strings= XXX YYY 
(A)XXX(B)(C)AAA(D)999

質問:

出力を生成するために、キー検索で (A) の for-each が必要なのはなぜですか? (C) では、select は関数を文字列に評価し、(D) では、select はパラメーターを文字列に評価します。(B) の関数が XXX に評価されないのはなぜですか?

ここで重要な概念が欠けていることはわかっていますが、さまざまな XSLT ドキュメントを数時間調べても答えが返されませんでした。

どうもありがとう。

4

1 に答える 1

2

このkey()関数は、現在のノードのドキュメントである現在のドキュメントのキー テーブルを検索します。

この<xsl:for-each>命令は、現在のノードを XPath アドレスで指定されたノードに配置します。この場合、これはdocument('')呼び出しのためにスタイルシートにあります。

したがって<xsl:for-each>、現在のドキュメントが呼び出し時にスタイルシートであることを確認するために使用しているため、使用されるルックアップ テーブルはスタイルシートのルックアップ テーブルであり、データ ファイルのルックアップ テーブルではありません。

XSLT 2.0 には 3 番目の引数がありkey()、ルックアップ テーブルを検索するサブツリー (任意のツリー内) の頂点として使用するノードです。

私の XSLT ブックの 319 ~ 323 ページに役立つ情報があり、 http: //www.CraneSoftwrights.com/training/#ptux から「試して購入」ベースで無料でダウンロードできます。無料でダウンロードしたコピーを削除してください。

于 2013-09-12T16:24:47.947 に答える