2009-08-21 8 views
7

送信されたパラメータがYYYYMMDD形式であるかどうかをチェックするXSLT関数があります。いくつかの条件では、私は、これらの条件のSAXONはエラーXSLT関数の空のシーケンスの処理

下に投げている時に、関数に任意の値を取得しておりません「空のシーケンスは、CDAの最初の引数として許可されていません。isValidDate()」

この状況をどのように処理するかについてのご意見はありますか?

答えて

12

XSLTにはNull値はありません。欠損値を表すには、長さゼロの文字列または空のシーケンスを使用できます。空のシーケンスはcount($ x)から0を返しますが、長さゼロの文字列は、文字列の長さが0(count($ x)= 1)のxs:string型の項目を1つ含むシーケンスですと文字列長($ x)= 0)。

ほとんどの標準XPath関数は長さゼロの文字列または空のシーケンスを受け入れますが、カスタム関数では使用できません。

文字の連続を選択すると問題が発生することがあります。たとえば、ノードが存在しない文字列を含むノードの値を選択すると、空のシーケンスが返されますが、ノードが存在し、値が空の場合は空の文字列が取得されます。

常に空の文字列を持つように値を選択する方法を変更します(または、空のシーケンスを受け入れるようにisValidDate関数をラップ/変更します)。次の関数定義では、空のシーケンスを受け入れて、それを長さゼロの文字列に変換します。

<xsl:function name="cda:isValidDate" as="xs:boolean"> 
    <xsl:param name="datestring" as="xs:string?"/> 
    <xsl:variable name="reallyastring" select="string($datestring)"/> 
    Your code 
</xsl:function> 

? xs:string? param型では、1つまたは複数の項目を指定できます。文字列(...)関数は、空の文字列を返さないので、空のシーケンスを長さゼロの文字列に変換します。

+1

また、関数を呼び出す前に 'xs:choose'を使ってシーケンスが空であるかどうか(' count()= 0')をチェックしてください。 –

+0

空のシーケンスを受け入れる関数を宣言できますか?そのためのデータ型はありますか? –

+0

空のシーケンスを受け入れ、ゼロの長さの文字列に変換する方法を示すように更新された回答を得ました。 –