3

以下が XSLT1.0 で機能しないのはなぜですか?

<xsl:template name="GenerateSummaryOld">
  <xsl:param name="Content" />
  <xsl:param name="Length" />
  <xsl:param name="DisableOutputEscaping" />

  <xsl:value-of select="substring($Content, 1, $Length)" disable-output-escaping="$DisableOutputEscaping" />
  <xsl:if test="string-length($Content) &gt; $Length"><i>...text has been shortened</i></xsl:if>
</xsl:template>

テンプレートを呼び出すときに次を使用しています。

<xsl:with-param name="DisableOutputEscaping">no</xsl:with-param>

SharePoint コンテンツ クエリ Web パーツでこれを試していますが、Web パーツ エラーが発生します。テンプレートで disable-output-escaping を「yes」または「no」としてハードコーディングすると、エラーは発生しません。

4

2 に答える 2

2

簡単な答え: の値はdisable-output-escapingXSLTスタイルシートで文字通り指定する必要があります。スタイルシートの実行時に計算することはできません。

つまり、観察している動作は、言語定義で規定されている動作です。

長い答え:XSLT 1.0仕様は、次 のような構文を示していますxsl:value-of(多かれ少なかれ):

  <!-カテゴリ:命令->
  <xsl:value-of
       select = string-expression
       disable-output-escaping = "yes" | 「いいえ」/>

ここでは「string-expression」がイタリック体になっていることに注意してください。これは、select属性の値が文字列 " string-expression"ではなく、評価して文字列に強制変換できるXPath式を持っていることを意味します。ただし、の「yes」と「no」はdisable-output-escapingイタリック体ではなく、式であるとは説明されておらず、属性値テンプレートであるとは説明されていません。「yes」または「no」の値は文字通り指定する必要があります。

仕様がこれを明示的に(私が見つけることができた)言うことに最も近いのは、属性値テンプレートに関するセクション7.6.2の注記です。

注:すべての属性が属性値テンプレートとして解釈されるわけではありません。値が式またはパターンである属性、最上位要素の属性、および名前付きXSLTオブジェクトを参照する属性は、属性値テンプレートとして解釈されません。..。

これは、スタイルシートを単に解釈するだけでなくコンパイルできるようにするために設計された、XSLTの多数の初期バインディング制約の1つです。

于 2012-12-18T02:16:25.957 に答える
1

説明は、CM Sperberg-McQueen による良い回答で提供されました。

回避策は次のとおりです。

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

 <xsl:variable name="vAmp">&amp;</xsl:variable>
 <xsl:variable name="vYesNo" select="'yes'"/>

 <xsl:template match="/">
   <xsl:choose>
    <xsl:when test="$vYesNo = 'yes'">
      <xsl:value-of select="$vAmp" disable-output-escaping="yes"/>
    </xsl:when>
    <xsl:when test="$vYesNo = 'no'">
      <xsl:value-of select="$vAmp" disable-output-escaping="no"/>
    </xsl:when>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

この変換が任意の XML ドキュメント (使用されていない) に適用されると、結果は次のようになります。

&

を置き換えると:

 <xsl:variable name="vYesNo" select="'yes'"/>

:

 <xsl:variable name="vYesNo" select="'no'"/>

変更された変換の結果は次のようになります。

&amp;
于 2012-12-18T04:53:36.137 に答える