2

xsl:param から属性値を取得し、それを xsl:if テスト条件で使用しようとしています。したがって、次のxmlが与えられます

<product>
  <title>The Maze / Jane Evans</title> 
</product>

そしてxsl

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

<xsl:param name="test" select="Jane"/>

 <xsl:template match="title[contains(., (REFERENCE THE SELECT ATTRIBUTE IN PARAM))]">
   <h2>
    <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
    <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>

 <xsl:template match="title">
   <h2><xsl:value-of select="."/></h2>
 </xsl:template>
</xsl:stylesheet>

戻りたい

The Maze

Jane Evans
4

2 に答える 2

3

この行に問題があります:

<xsl:param name="test" select="Jane"/>

これは、xsl:paramnamedtestを定義します。その値は、現在のノード ('/') named の子要素ですJane。最上位の要素はであり、 では<product>ない<Jane>ため、testパラメーターには空のノード セットの値 (および文字列値 -- 空の文字列) が含まれます。

あなたが望む(周囲のアポストロフィに注意してください):

<xsl:param name="test" select="'Jane'"/>

処理タスク全体はかなり簡単に実装できます

この XSLT 1.0 変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pTest" select="'Jane'"/>

 <xsl:template match="title">
  <xsl:choose>
    <xsl:when test="contains(., $pTest)">
       <h2>
        <xsl:value-of select="substring-before(., '/')"/>
       </h2>
       <p>
        <xsl:value-of select="substring-after(., '/')"/>
       </p>
    </xsl:when>
    <xsl:otherwise>
      <h2><xsl:value-of select="."/></h2>
    </xsl:otherwise>
  </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<product>
    <title>The Maze / Jane Evans</title>
</product>

必要な正しい結果が生成されます

<h2>The Maze </h2>
<p> Jane Evans</p>

説明:

XSLT 1.0 構文では、一致パターンでの変数/パラメーターの参照が禁止されています。これが、any に一致する単一のテンプレートtitleを用意し、特定の希望する方法で処理するための条件をテンプレート内で指定する理由です。

XSLT 2.0 ソリューション:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pTest" select="'Jane'"/>

 <xsl:template match="title[contains(., $pTest)]">
   <h2>
     <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
     <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>

 <xsl:template match="title">
   <h2><xsl:value-of select="."/></h2>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメント (上記) に適用されると、同じように正しい結果が生成されます。

<h2>The Maze </h2>
<p> Jane Evans</p>

説明:

XSLT 2.0 には XSLT 1.0 の制限がなく、一致パターン内で変数/パラメーター参照を使用できます。

于 2012-06-19T04:05:25.813 に答える
1

$test という用語は、テスト パラメータの値を指します。$test を使用

例えば:

 <xsl:template match="title[contains(., $test)]">
   <h2>
    <xsl:value-of select="substring-before(., '/')"/>
   </h2>
   <p>
    <xsl:value-of select="substring-after(., '/')"/>
   </p>
 </xsl:template>
于 2012-06-19T03:40:28.303 に答える