XML模式中的任何元素都会阻止XQuery

时间:2011-09-01 08:03:11

标签: sql sql-server-2008 xsd xquery xquery-sql

我有以下XML Schema:

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元素,则上面的代码可以正常运行而不会出现任何错误。我做错了什么?

1 个答案:

答案 0 :(得分:2)

我使用语句

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

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

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

string(...)将节点集转换为字符串(或空字符串)。我认为这对xsd:any有帮助,虽然我不完全确定原因 - 我认为处理节点Order完全丢失的可能性。


更新

进一步调查:

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

也有效。

所以它只是在这个实例中使它工作所需的字符串函数。