Поделиться через


Использование сокращенного синтаксиса в выражении пути

Во всех примерах, приведенных в разделе Основные сведения о выражениях пути в XQuery, для выражений пути используется полный синтаксис, включающий в себя имя оси и элемент проверки узла, которые разделены двойным двоеточием, за которыми могут следовать квалификаторы шага.

Например:

child::ProductDescription[attribute::ProductModelID=19]

Запрос XQuery поддерживает в выражениях пути следующие сокращения.

  • Ось child является осью по умолчанию. Поэтому в выражении ось child:: для шага может быть опущена. Например, /child::ProductDescription/child::Summary может быть записано как /ProductDescription/Summary.

  • Для оси attribute может использоваться сокращение «@». Например, /child::ProductDescription[attribute::ProductModelID=10] может быть записано как /ProudctDescription[@ProductModelID=10].

  • Для выражения /descendant-or-self::node()/ может быть записано сокращение //. Например, /descendant-or-self::node()/child::act:telephoneNumber может быть записано как //act:telephoneNumber.

    Предыдущий запрос получает все телефонные номера, хранящиеся в столбце AdditionalContactInfo таблицы Contact. Схема для столбца AdditionalContactInfo определена таким образом, что элемент <telephoneNumber> может появиться в любом месте документа. Поэтому для получения всех телефонных номеров необходимо просмотреть каждый узел в документе. Поиск начинается от корня документа и проходит по всем узлам, являющимся его потомками.

    Следующий запрос получает все контактные телефонные номера для указанного клиента:

     SELECT AdditionalContactInfo.query('           
                 declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";           
                 declare namespace crm="http://schemas.adventure-works.com/Contact/Record";           
                 declare namespace ci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";           
                 /descendant-or-self::node()/child::act:telephoneNumber           
                 ') as result           
     FROM Person.Person           
     WHERE BusinessEntityID = 291;           
    

    Если выражение пути заменяется сокращенным синтаксическим выражением, //act:telephoneNumber обеспечивает тот же самый результат.

  • Элемент self::node() в шаге может быть заменен сокращенным выражением, сводящимся к точке (.). Однако точка не эквивалентна элементу self::node() и не взаимозаменяема с ним.

    Например, в следующем запросе точка представляет значение, а не узел:

    ("abc", "cde")[. > "b"]
    
  • Элемент parent::node() в шаге может быть заменен двумя точками (..).