1

現在の要素の値が特定の型 (xs:integer など) である必要があり、そうでない場合は例外をスローすることをアサートする良い方法はありますか? XSL 2.0 の使用

4

4 に答える 4

1

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、特定の型を決定するまで、最も一般的な型からより具体的な型までの値をテストします。

于 2012-12-30T16:57:03.217 に答える
0

cast as演算子を使用します。

'5' cast as xs:integer5 を返します

'foo' cast as xs:integerCannot convert string "d" to an integerサクソンを使って投げます。

独自のエラーをスローしたい場合はcastable as、使用できます。

if (not('foo' castable as xs:integer)) then
   error((), 'bad')
于 2012-12-31T02:57:54.803 に答える
0

では、次のようXPathに使用できます。instance of

xs:integer の 5 つのインスタンス

この例は、指定された値が指定された型のインスタンスであるため、true を返します。

詳細については、こちらを確認してください。

于 2012-12-30T16:01:27.643 に答える
0

Saxon 9 のエンタープライズ エディションや XmlPrime や AltovaXML などのスキーマ対応 XSLT 2.0 プロセッサを使用すると、W3C XML スキーマを使用して、入力ドキュメントを XSLT で処理するときに検証できます。

于 2012-12-30T16:57:51.547 に答える