我有以下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
元素,则上面的代码可以正常运行而不会出现任何错误。我做错了什么?
答案 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')
也有效。
所以它只是在这个实例中使它工作所需的字符串函数。