开发者

any element in XML schema blocks XQuery

I have the following 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:elem开发者_运维问答ent>           
          </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

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

Then I use it in this way:

DECLARE @xml xml(test)

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

</PointConf>'

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

SELECT gives me the following error:

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

Without the xsd:any element in the schema the code above works without any errors. What am I doing wrong?


I got the select to work by using the statement

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

I understand the requirement for the [1] index on the Order node, as this can be a list, however I don't see why its required for the PointConf node.

The [1] needs to be used at the actual level where a list exists to restrict that list to a single return value

The string(...) turns the node set into a string (or empty string). I think this helps with the xsd:any although I'm not completely sure why - something to do with handling the possibility of the node Order being missing completely I think.


Update:

Investigating further:

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

also works.

So its just the string function that's required to make it work in this instance.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜