1

Saxon9.4とXSLT2.0を使用しています

スタイルシートに次のコードスニペットがあります:-

<xsl:template name="some_template">
  <xsl:param name="some_param" as="xs:integer?"/>
</xsl:template>

これは基本的に、オプションの整数パラメーターを受け取るテンプレートです。でもこう呼ぼうとすると

<xsl:call-template name="some_template>
  <xsl:with-param name="some_param">
    <xsl:if test="some_condition">
      <xsl:value-of select="xs:integer(./@attr div 20)"/>
    </xsl:if>
  </xsl:with-param>
</xsl:call-template>

次のようなエラーメッセージが表示されます:-

Validation error 
  FORG0001: Cannot convert zero-length string to an integer

ただし、次の2つのスタイルシートではエラーは発生しません:-

<xsl:call-template name="some_template>
  <xsl:with-param name="some_param">
    <xsl:value-of select="xs:integer(./@attr div 20)"/>
  </xsl:with-param>
</xsl:call-template>

また

<xsl:variable name="dummy" as="xs:integer?">
  <xsl:if test="some_condition">
    <xsl:value-of select="xs:integer(./@attr div 20)"/>
  </xsl:if>
</xsl:variable>
<xsl:call-template name="some_template>
  <xsl:with-param name="some_param" select="$dummy"/>
</xsl:call-template>

したがって、明らかにタイプ情報はブロック全体で保持されていません。最初のものを機能させる方法はありますか?3番目のスタイルシートは、意味的に必要なことを実行しますが、これを実行できるようにするためだけに、(いくつかの)ダミー変数を作成することは避けたいと思います。

ありがとう!

4

3 に答える 3

1

ここで何が起こっているのかは完全にはわかりませんが、明らかなのは、コードを改善してそれほど混乱しないようにする方法です。記述されたコードを使用して、実際の場合、double を計算し、それを整数に変換し、整数をテキスト ノードに変換し、それをドキュメント ノードでラップし、ドキュメント ノードをパラメーターとして渡し、これを型なしに原子化します。予想される型がアトミックであるため、受信側でアトミックになり、型指定されていないアトミック値が整数に変換されます。これはすべて機能するはずですが、実際には遠回りであり、xsl:with-param の「as="xs:integer"」によって簡単に回避できます。

false の場合、子のないドキュメント ノードを渡し、それを xs:integer? に変換しています。失敗します - 空のシーケンスには変換されません。だからあなたの言うことにもかかわらず、私はそれが間違った道で失敗していると思います.

于 2013-03-05T15:33:26.677 に答える
1

あなた<xsl:if>が false の場合にエラーが発生すると思います。つまり、パラメーターに値が割り当てられていません。この解決策のいずれかを試すことができます:

デフォルト値

のデフォルト値を設定しようとしました<xsl:param>か?

<xsl:template name="some_template">
  <xsl:param name="some_param" select="-1" as="xs:integer?" />
</xsl:template>

falseケースの管理

XPath2.0 の if-then-else 式を使用してテンプレートを呼び出すときは、常に値を設定します。

<xsl:call-template name="some_template>
  <xsl:with-param name="some_param" select="
     if (some_condition) 
     then xs:integer(./@attr div 20)
     else -1"
  />
</xsl:call-template>

ケース-1の値として使用します。false

于 2013-03-04T23:21:08.843 に答える
1

この変換:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xsl:output method="text"/>

 <xsl:template match="/*">
    <xsl:call-template name="some_template">
      <xsl:with-param name="some_param" select=
       "if(some_condition)
          then xs:integer(@attr div 20)
          else ()
      "/>
    </xsl:call-template>
 </xsl:template>

 <xsl:template name="some_template">
  <xsl:param name="some_param" as="xs:integer?"/>
  XXX
</xsl:template>
</xsl:stylesheet>

次の XML ドキュメントのそれぞれに適用した場合:

<t attr="20">
 <some_condition/>
</t>

<t>
 <some_condition/>
</t>

<t attr="20">
</t>

<t>
</t>

必要な正しい結果が生成されます (例外は発生しません)。

  XXX
于 2013-03-05T03:12:34.893 に答える