0

私は XSL に少し慣れていないので、いくつか問題があります。私の調査によると、XSL 変数<xsl:variable>は、トップレベルで宣言されている場合はグローバルであり、テンプレート内で宣言されている場合はローカルであり、値を変更することはできません。ということは、グローバル変数を宣言して、テンプレート内でその値を変更する方法がないということですか?

結果セットを反復処理している次の状況があります。次のようなものがあります。

<xsl:for-each select="NewDataSet/Table1">
 <xsl:if test="position()= 1">
  <xsl:value-of select="SchoolName"/>
 </xsl:if>

 <xsl:if test="position()= 2">
  <xsl:value-of select="gender"/>
 </xsl:if>

 <xsl:if test="position() = last()">
  <div onclick="showTallyBySchool(,'{SchoolName}','{gender}')">
   <xsl:value-of select="node()"/>
  </div>
 </xsl:if>
</xsl:for-each>

ご覧のとおり、反復中に 3 番目の「if」で「gender」と「schoolname」の値が必要です。それらを保存できない場合、どうすればそれらにアクセスできますか?

編集:いくつかのタイプミスを修正しました。これが役立つ場合は、XML からの抜粋を次に示します。

<NewDataSet>
 <Table1> 
  <SchoolName>Unknown School</SchoolName>  
  <Gender>Male</Gender> 
  <PS>0</PS> 
  <PK>0</PK> 
  <K>0</K> 
 </Table1>
</NewDataSet>
4

3 に答える 3

2

現在のノードに対して相対的にアクセスします。

XML の構造について混乱していると思います。たとえばSchoolName最初の Table1. しかし、コードは次のようになります。

<xsl:for-each select="NewDataSet/Table1[last()]">

  <xsl:variable name="school_name" select="../Table1[1]/SchoolName"/>
  <xsl:variable name="gender" select="../Table1[2]/gender"/>

  <div onclick="showTallyBySchool(,'{$school_name}',{$gender})">
    <xsl:value-of select="node()"/>
  </div>

</xsl:for-each>

ターゲットの XML データを表示してください。より良い解決策があると確信しています。

于 2013-04-08T15:17:05.983 に答える
0

XSL 変数は、最上位で宣言されている場合はグローバルであり、テンプレート内で宣言されている場合はローカルです。

いいえ、XSL 変数は、それを含む XSLT 要素に非常に厳密に適用されます。内で宣言すると<xsl:if>、それぞれの の後では使用できなくなります</xsl:if>

値を変更することはできません。

そうです、すべての XSLT 変数は不変です。

ということは、グローバル変数を宣言して、テンプレート内でその値を変更する方法がないということですか?

正解です。その必要はありません。原則として、XSLT で変数の値を変更しようとしていることに気付いた場合、問題に対するアプローチは間違っています。


ご覧のとおり、反復中に 3 番目の「if」で「gender」と「schoolname」の値が必要です。それらを保存できない場合、どうすればそれらにアクセスできますか?

あなたのXMLで...

<NewDataSet>
  <Table1> 
    <SchoolName>Unknown School</SchoolName>  
    <Gender>Male</Gender> 
    <PS>0</PS> 
    <PK>0</PK> 
    <K>0</K> 
  </Table1>
</NewDataSet>

...解決策は非常に簡単です。変数はまったく必要ありません。XML ノード<SchoolName><Gender>直接アクセスするだけです。

<xsl:template match="NewDataSet">
  <xsl:apply-templates select="Table1" />
</xsl:template>

<xsl:template match="Table1">
  <div>
    <xsl:value-of select="SchoolName" />
  </div>
  <div>
    <xsl:value-of select="Gender" />
  </div>
  <div onclick="showTallyBySchool('{SchoolName}', {Gender})">
    <xsl:text>Show Tally</xsl:text>
  </div>
</xsl:template>

一般的には、HTML と JavaScript を混在させないこと、特にXSLT を使用して JavaScript を生成しないことをお勧めします。これは醜くなるだけです。

<SchoolName>一重引用符を含む a を想像してください。上記のセットアップでは、すでにイベント ハンドラーが壊れています。

さらに、次のようなインライン イベント ハンドラーを使用onclickすると、問題の分離の原則 (この場合はマークアップとページ ロジック) に違反し、醜い HTML が生成され、この場合、本当にバグを修正したいときに XSLT ファイルを変更する必要があることを意味します。あなたのJavaScriptで。最新の JS フレームワークとの非互換性 (最近ではあまり一般的ではありませんが、メモリ リークでさえあります) などの他の影響がある可能性があります。要するに、一般的に嫌われています。すべての JavaScript を別のファイルに保存することをお勧めします。

于 2013-04-08T16:12:05.877 に答える