1

次のようなXMLドキュメントを変換する必要があるアプリケーションを開発しています。

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE words SYSTEM "words.dtd">
<words>
<word id="word_1">Alfa</word>
<word id="word_2">Beta</word>
<word id="word_3">Gamma</word>
<word id="word_4">Delta</word>
<word id="word_5">Zeta</word>
</words>

XSLTスタイルシートを使用します。変換の結果(この場合)Deltaを(この場合)にしたいのですが、これは私が使用しているXSLです:

<?xml version='1.0' encoding='ISO-8859-1'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="Hurrengo_Hitza">word_4</xsl:param>
    <xsl:template match="word/[@id = Hurrengo_Hitza]">
  <html>
  <body>
    <tr>
      <td><xsl:value-of select="text()"/></td>
    </tr>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

結果が表示されません。XSLTで何を変更する必要がありますか?XPath式に何か問題がありますか?

4

3 に答える 3

3

ここには2つの問題があります

  1. word/[@id = Hurrengo_Hitza]構文的に無効なXPathです-述語showldは、ロケーションステップ内のノードテストに従います。

  2. <xsl:template match="word/[@id = Hurrengo_Hitza]">。構文的に有効なXPath式と一致パターンに修正された場合でも<xsl:template match="word[@id = Hurrengo_Hitza]">、このテンプレートはどのノードとも一致しません。属性がその要素の1つの文字word列値idと等しい文字列値と一致します。Hurrengo_Hitzaただしword、提供されたXMLドキュメントのどの要素にも、という名前の子要素がHurrengo_Hitzaありません。したがって、テンプレートはどのノードとも一致せず、まったく実行されません。

解決策

必要なのは、次のような一致パターンです。-変数またはパラメーターの参照は、文字word[@id = $Hurrengo_Hitza]で始まる必要があります。$

変更した場合

<xsl:template match="word/[@id = Hurrengo_Hitza]"> 

<xsl:template match="word[@id = $Hurrengo_Hitza]"> 

XSLT2.0ソリューションが機能します。

ただし、XSLT 1.0(使用しているようです)では、一致パターン内に変数またはパラメーター参照を含めることは違法です。

したがって、XSLTソリューションは次のようになります。

<xsl:template match="word">
  <xsl:if test="@id = $Hurrengo_Hitza">
   <!-- Processing here -->
  </xsl:if> 
</xsl:template>
于 2012-04-17T13:07:55.907 に答える
1

XSLTのパラメーターの前には、ドル記号($)を付ける必要があります。

だから試してみてください:

<xsl:template match="word[@id = $Hurrengo_Hitza]">

アップデート:

variablesXSLT2のmatch属性でのみ許可されていると思います。

しかし、これがあなたがそれを行う方法です:

<xsl:param name="Hurrengo_Hitza" select="'word_4'" />

<xsl:template match="/">
        <xsl:for-each select="//word[@id = $Hurrengo_Hitza]">
          <html>
          <body>
            <tr>
              <td><xsl:value-of select="text()"/></td>
            </tr>
          </body>
          </html>
        </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
于 2012-04-17T10:54:46.340 に答える
0

変化する

<xsl:template match="word/[@id = Hurrengo_Hitza]"> 

<xsl:template match="word/[@id = $Hurrengo_Hitza]">
于 2012-04-17T10:57:25.193 に答える