3

私は次のXMLスキーマを持っています:

CREATE XML SCHEMA COLLECTION test AS '
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="PointConf">
    <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="GlobalFlags">
              <xsd:complexType>
                    <xsd:sequence>
                      <xsd:element name="Order" type="OrderType"/>
                      <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
                    </xsd:sequence>
              </xsd:complexType>  
            </xsd:element>           
          </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name="OrderType">
    <xsd:attribute name="value" type="xsd:int" />
  </xsd:complexType>
</xsd:schema>
'
GO

それから私はそれをこのように使用します:

DECLARE @xml xml(test)

SET @xml='<PointConf>
  <GlobalFlags>    
    <Order value="1" />
  </GlobalFlags>

</PointConf>'

SELECT @xml.value('(/PointConf/GlobalFlags/Order/@value)[1]','int')

SELECT次のエラーが発生します。

XQuery [value()]: 'value()' requires a singleton (or empty sequence), found operand of type '(xs:int | xdt:anyAtomicType *) ?'

スキーマに要素がないxsd:any場合、上記のコードはエラーなしで機能します。私は何が間違っているのですか?

4

1 に答える 1

2

私はステートメントを使用して動作するように選択しました

SELECT @xml.value('string(/PointConf[1]/GlobalFlags/Order[1]/@value)','int')

これはリストである可能性があるため、Orderノードのインデックスの要件を理解していますが、[1]ノードにインデックスが必要な理由がわかりませんPointConf

リストが存在する実際のレベルで使用して、その[1]リストを単一の戻り値に制限する必要があります

string(...)、ノードセットを文字列(または空の文字列)に変換します。xsd:any理由は完全にはわかりませんが、これは役立つと思います。ノードOrderが完全に失われる可能性を処理することと関係があると思います。


アップデート:

さらに調査する:

SELECT @xml.value('string((/PointConf/GlobalFlags/Order/@value)[1])','int')

また動作します。

したがって、このインスタンスで機能させるために必要なのは文字列関数だけです。

于 2011-09-01T08:51:57.610 に答える