5

私は XSLT 変数を使用しようとしていますが、あまり成功していません。

次のコード スニペットがあります。

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xalan="http://xml.apache.org/xslt"
  version="1.0">

    <xsl:template match="/">
      <xsl:variable name="config" select="query/@config"></xsl:variable>

そのため、最上位要素「query」の「config」属性の値に設定された変数「config」が存在することを期待しています。

次に、後でスタイルシートで変数を使用しようとします。次に例を示します。

<a href="localhost/test?go">
    {$config}
</a>

しかし、出力 HTML ドキュメントに表示される出力は次のとおりです。

<a href="localhost/test?go">
    {$config}
</a>

そのため、期待どおりに値が置換されていません。

これは考えられる最も単純なケースだと思うので、私はばかげたことをしています! 助けてください、ありがとう!


更新 回答してくれたすべての人に感謝します。属性で働いているのか、それとも外で働いているのかというさまざまな文脈を誤解していました. 私の問題をうまく整理しました!

できれば、私が持っているものと、属性を説明した@Aaron Digullaの2つの答えを受け入れることができます。

4

6 に答える 6

13

同じように見えますが、微妙に異なる 2 つの質問があります。1)変数を名前で参照するにはどうすればよいですか? 2)変数はどこで名前で参照できますか?

まず、変数は常に$varname構文を使用して参照されます。第二に、これは式が許可されている場所であればどこでも実行できます。混乱しているように見えるのは、この 2 番目の部分です。まず、要素または属性の値はデフォルトで文字どおりに出力されるため、次の例では変数は実際には参照されていません。

<element attr="$test">$test or {$test}</element>

出力は、入力されたものと文字通り一致します。

変数の値を出力するには、式が許可されている場所で変数を参照する必要があります。要素のコンテンツでは、xsl:value-of;を使用します。属性値テンプレートとして扱われる属性(リテラル結果要素の属性など) では、式は中括弧で区切られます{}。次の宣言を想定します。

<xsl:variable name="test" select="'value'"/>

...次に、次のようにします。

<element attr="{$test}"><xsl:value-of select="$test"/></element>

...結果:

<element attr="value">value</element>

AVT と に関するいくつかの別れのメモvalue-of:

  • どちらの場合も、変数は として参照されまし$testた。AVT の中括弧は変数参照の一部ではありません。それらは式の区切り文字です。
  • いずれの場合も、式に変数への参照が含まれている必要はありません。任意の XPath 式が許可されます。
  • XSLT ドキュメント内のすべての属性が属性値テンプレートとして扱われるわけではありません。たとえば、xsl:valueselect属性はすでに式をコンテンツとして受け入れていることに注意してください。
  • 質問value-of:このように属性で使用できないのはなぜですか?

    <element attr="<xsl:value-of select="$test"/>"/>
    

    回答: XSLT ドキュメントには整形式の XML が含まれている必要があるためです (そうではありません)。

  • 質問{$varname}:要素コンテンツで使用できないのはなぜですか?

    ばかげた答え: XSLT の作成者がそのように設計しなかったためです。

于 2011-12-14T18:44:32.803 に答える
12

スタイルシートでは、次を使用する必要があります。

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

それ以外の:

{$config}
于 2009-03-11T12:30:58.470 に答える
6

{$config}XSLT 要素の属性でのみ機能します。(注: 完全な XPath 式を中かっこで囲む必要があるため、中かっこ内にドル記号を使用します)

于 2009-03-11T12:34:40.973 に答える
3

<xsl:value-of select="$config"/>の代わりに使用し{$config}ます。

于 2009-03-11T12:29:59.160 に答える
1

@lwburk の回答は素晴らしい (+1) ですが、最後の質問/回答は XSLT 1.0 および 2.0 に対してのみ正確です。3.0 では、TVT ( Text Value Template ; @lwburk の回答で言及されている AVT (Attribute Value Template) に似ています) を使用できます。

TVT を使用するxsl:expand-text="yes"には、要素に standard 属性を追加します。これにより、プロセッサはその要素の子孫テキスト ノードを TVT として扱います。

例:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

出力(整形式の XML を入力として使用)

<result>This is Dan's result: BAM!</result>

注: Saxon-PE 9.5 を使用してテストされています。

于 2014-05-12T22:44:44.547 に答える
0

<xsl:value-of select="config"/>?を使用する必要があるためです。

于 2009-03-11T12:30:43.370 に答える