現在の要素の値が特定の型 (xs:integer など) である必要があり、そうでない場合は例外をスローすることをアサートする良い方法はありますか? XSL 2.0 の使用
4 に答える
FXSLf:type()
ライブラリの関数を使用して、変数/値の型を動的に決定できます。
FXSL でのテスト変換は次のとおりです。f:type()
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:import href="../f/func-type.xsl"/>
<!-- To be applied on ../data/numList.xml -->
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
f:apply(f:typeConstructor(11),'03'): <xsl:value-of select="f:apply(f:typeConstructor(11),'03')"/>
f:apply(f:typeConstructor('xxx'),'03'): <xsl:value-of select="f:apply(f:typeConstructor('xxx'),'03')"/>
f:apply(f:typeConstructor(11),'03') gt 4: <xsl:value-of select="f:apply(f:typeConstructor(11),'03') gt 4"/>
f:type(f:apply(f:typeConstructor(11),'03')): <xsl:value-of select="f:type(f:apply(f:typeConstructor(11),'03'))"/>
f:type(f:apply(f:typeConstructor('string'), 3)): <xsl:value-of select="f:type(f:apply(f:typeConstructor('string'),'03'))"/>
<!-- Supported only by a SA Processor -->
xs:token('abc') : <xsl:value-of select="f:type(xs:token('abc'))"
use-when="system-property('xsl:is-schema-aware')='yes'"/>
-1 : <xsl:value-of select="f:type(-1)"/>
<!-- Supported only by a SA Processor -->
xs:negativeInteger(-1) : <xsl:value-of select="f:type(xs:negativeInteger(-1))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
xs:nonPositiveInteger(0) : <xsl:value-of select="f:type(xs:nonPositiveInteger(0))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
0 : <xsl:value-of select="f:type(0)"/>
3 : <xsl:value-of select="f:type(3)"/>
3. : <xsl:value-of select="f:type(3.)"/>
3.0E1 : <xsl:value-of select="f:type(3.0E1)"/>
xs:float(3) : <xsl:value-of select="f:type(xs:float(3))"/>
<!-- Supported only by a SA Processor -->
xs:positiveInteger(3) : <xsl:value-of select="f:type(xs:positiveInteger(3))"
use-when="system-property('xsl:is-schema-aware')='yes'" />
'3' : <xsl:value-of select="f:type('3')"/>
(/*/*/text())[1] : <xsl:value-of select="f:type((/*/*/text())[1])"/>
data((/*/*/text())[1]) : <xsl:value-of select="f:type(data((/*/*/text())[1]))"/>
</xsl:template>
</xsl:stylesheet>
この変換がこの XML ドキュメントに適用されると、次のようになります。
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
必要な正確な結果が生成されます。
f:apply(f:typeConstructor(11),'03'): 3
f:apply(f:typeConstructor('xxx'),'03'): 03
f:apply(f:typeConstructor(11),'03') gt 4: false
f:type(f:apply(f:typeConstructor(11),'03')): xs:integer
f:type(f:apply(f:typeConstructor('string'), 3)): xs:string
xs:token('abc') : xs:string
-1 : xs:integer
xs:negativeInteger(-1) : xs:integer
xs:nonPositiveInteger(0) : xs:integer
0 : xs:integer
3 : xs:integer
3. : xs:decimal
3.0E1 : xs:double
xs:float(3) : xs:float
xs:positiveInteger(3) : xs:integer
'3' : xs:string
(/*/*/text())[1] : xml:node
data((/*/*/text())[1]) : xs:string
説明:
f:type()
、そのソースからわかるように、XPath 2.0 演算子を内部的に使用しinstance of
、特定の型を決定するまで、最も一般的な型からより具体的な型までの値をテストします。
cast as
演算子を使用します。
'5' cast as xs:integer
5 を返します
'foo' cast as xs:integer
Cannot convert string "d" to an integer
サクソンを使って投げます。
独自のエラーをスローしたい場合はcastable as
、使用できます。
if (not('foo' castable as xs:integer)) then
error((), 'bad')
では、次のようXPath
に使用できます。instance of
xs:integer の 5 つのインスタンス
この例は、指定された値が指定された型のインスタンスであるため、true を返します。
詳細については、こちらを確認してください。
Saxon 9 のエンタープライズ エディションや XmlPrime や AltovaXML などのスキーマ対応 XSLT 2.0 プロセッサを使用すると、W3C XML スキーマを使用して、入力ドキュメントを XSLT で処理するときに検証できます。