경로 식에 축약형 구문 사용

XQuery의 경로 식 이해에 있는 모든 예에서는 경로 식에 대해 축약하지 않은 구문을 사용합니다. 경로 식의 축 단계에 대해 축약하지 않은 구문은 축 이름과 노드 테스트를 포함하고 두 개의 콜론으로 분리되며 뒤에 0개 이상의 단계 한정자가 옵니다.

예를 들면 다음과 같습니다.

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로 쓸 수 있습니다.

    이전 쿼리는 Contact 테이블의 AdditionalContactInfo 열에 저장된 모든 전화 번호를 검색합니다. 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.Contact           
     WHERE ContactID=1           
    

    경로 식 대신 축약형 구문인 //act:telephoneNumber를 사용하는 경우 같은 결과를 얻게 됩니다.

  • **self::node()**는 단일 점(.)으로 축약될 수 있습니다. 그러나 이 점이 **self::node()**와 동등하거나 교환 가능한 것이 아닙니다.

    예를 들어 다음 쿼리에서 점을 사용하는 것은 노드가 아닌 값을 나타냅니다.

    ("abc", "cde")[. > "b"]
    
  • 단계에서 **parent::node()**는 두 개의 점(..)으로 축약될 수 있습니다.