любой элемент в схеме XML блокирует XQuery - PullRequest
3 голосов
/ 01 сентября 2011

У меня есть следующая 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 в схеме приведенный выше код работает без каких-либо ошибок.Что я делаю не так?

1 Ответ

2 голосов
/ 01 сентября 2011

Я получил выбор для работы с помощью оператора

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

тоже работает.

Так что это просто строковая функция, которая требуется для работы в этом случае.

...