1

私はこのXSLTを持っています:

<xsl:template match="/">

    <xsl:variable name="errorCount" select="count($orders/*[1]/cm:Error)" />

    <xsl:apply-templates select="@*|node()">
        <xsl:with-param name="errorCount" select="$errorCount" tunnel="yes" />
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="status">
    <xsl:param name="errorCount" tunnel="yes" />
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="$errorCount > 0">
                <xsl:text>ERROR</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>OK</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

トンネリングとすべてが機能しているように見えますが、変換は次のエラーで失敗します。

「>」の第 1 オペランドの必須項目タイプは数値です。指定された値の項目タイプは xs:string です

私は最初にそれが使用されているテンプレートに変数宣言を持っていましたが、それはうまくいきました。他のテンプレートでも同じカウントを使用する必要があるため、移動しました。

この変数/パラメーターが実際に数値であることをどのように/どこで宣言しますか?

4

3 に答える 3

7

XSLT 2.0 を使用しているためas、テンプレートの xsl:param にも属性を追加する必要があります。例(小数を含む値がある場合など、結果の数値が必要なものに応じて、異なる as 値を使用する必要がある場合があります。Michael Kay のポイントごとに、トンネル値も修正する必要があります) :

<xsl:param name="errorCount" tunnel="yes" as="xs:integer" />

as 型 (この場合は整数) に変換できない場合、変換は失敗します。Eero のソリューションは、値が 0 より大きいかどうかを確認する必要があるため、よりきれいに見えるかもしれません。ただし、XSLT 2.0 を使用しているため、パラメーター/変数を入力することをお勧めします。

于 2013-02-19T13:47:10.730 に答える
2

number()文字列を数値に変換するために使用できます。

<xsl:when test="number($errorCount) > 0">
  <xsl:text>ERROR</xsl:text>
</xsl:when>
于 2013-02-19T13:28:03.370 に答える
2

私の疑いでは、tunnel="yes" ではなく tunnel="true" を書いたため、tunnel を指定したという事実が (誤って) 無視されており、パラメータにデフォルト値であるゼロが与えられています。長さの文字列。

于 2013-02-19T16:19:34.800 に答える