2

現在、XSLT 1.0 から XSLT 2.0 にアップグレードしようとしています。XSLT 1.0 で動作していたテンプレートの 1 つに、次のものがありました。

<xsl:template name="some_t">
  <xsl:param name="some_numeric_param"/>
  <xsl:if test="$some_numeric_param != ''">
    <xsl:attribute name="some_name">
      <xsl:value-of select="$some_numeric_param"/>
    </xsl:attribute>
  </xsl:if>
</xsl:template>

さて、私がこのテンプレートを呼び出す 3 つのケースがあります :-

<xsl:call-template name="some_t">
  <xsl:with-param name="some_numeric_param" select="floor(number(./@attr1) div 20)"/>
</xsl:call-template>

これを行うと、基本的に内部テンプレートは、ソース ドキュメントで「attr1」という属性が指定されている場合、「some_name」という属性のみを作成します。

また、これを呼び出す可能性のある別の状況は、このパラメーターなしです:-

<xsl:call-template name="some_t">
</xsl:call-template>

したがって、基本的にやりたいことは、パラメーターを渡すときに属性を作成し、それ以外の場合は作成しないことです。私のスタイルシートが正しいかどうかにかかわらず、これは XSLT 1.0 では機能しましたが、XSLT 2.0 では次のようなエラーが発生します:-

Error on line 195 of movwin.xsl:
  XPTY0004: Cannot compare xs:double to xs:string
Transformation failed: Run-time errors were reported

何か助けはありますか?Saxon 9.4 プロセッサを使用しています。

4

3 に答える 3

5

2.0 では、パラメーターの型を宣言することをお勧めします。整数を期待している場合は、宣言<xsl:param name="p" as="xs:integer"/>- し、それを文字列と比較しようとしないでください。整数が存在する場合と存在しない場合は、次のようにオプションの整数として宣言し<xsl:param name="p" as="xs:integer?"/>、空のシーケンス ( と記述()) を「null 値」として使用します。その後、 を使用して値が指定されているかどうかをテストできますtest="empty($p)"

数値を文字列と比較すると、文字列が数値に変換されるため、1.0 コードが機能します。空の文字列は NaN に変換され、NaN はどの値とも等しくありません。確認する必要がありますが、スタイルシートで version="1.0" を指定した場合に、下位互換モードで実行すると、2.0 でも機能すると思います。

于 2013-02-16T00:06:25.357 に答える
2

これは、数値と文字列を比較しているためです。

変更してみてください:

<xsl:if test="$some_numeric_param != ''">

に:

<xsl:if test="$some_numeric_param">

編集

また、$some_numeric_param = 0試してみてください:

<xsl:if test="string($some_numeric_param)">

!= ''比較を行う必要はありません。

于 2013-02-15T19:47:11.377 に答える
1

入力パラメーターを文字列に強制してみてください。

<xsl:if test="string($some_numeric_param) != ''">

xslt 2.0 は 1.0 よりも強く型付けされています。

于 2013-02-15T19:40:19.317 に答える