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')

我了解[1]Order 节点上索引的要求,因为这可以是一个列表,但是我不明白为什么它需要该PointConf节点。

[1]需要在存在列表的实际级别使用,以将该列表限制为单个返回值

string(...)节点集转换为字符串(或空字符串)。我认为这有助于xsd:any虽然我不完全确定为什么 - 我认为这与处理节点Order完全丢失的可能性有关。


更新:

进一步调查:

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

也有效。

所以它只是使它在这种情况下工作所需的字符串函数。

于 2011-09-01T08:51:57.610 回答