다음을 통해 공유


경로 식 - 노드 테스트 지정

적용 대상: SQL Server

경로 식의 축 단계는 다음 구성 요소를 포함합니다.

자세한 내용은 경로 식(XQuery)을 참조하세요.

노드 테스트는 조건이며 경로 식에서 축 단계의 두 번째 구성 요소입니다. 단계에서 선택한 모든 노드는 이 조건을 충족시켜야 합니다. 경로 식 /child::ProductDescription의 경우 노드 테스트는 ProductDescription입니다. 이 단계에서는 이름이 ProductDescription인 요소 노드 자식만 검색합니다.

노드 테스트 조건에는 다음이 포함될 수 있습니다.

  • 노드 이름 - 지정된 이름이 있는 주 노드 종류의 노드만 반환됩니다.

  • 노드 형식입니다. 지정된 형식의 노드만 반환됩니다.

참고 항목

XQuery 경로 식에 지정된 노드 이름은 Transact-SQL 쿼리와 같은 데이터 정렬 구분 규칙이 적용되지 않고 항상 대/소문자를 구분합니다.

노드 이름을 노드 테스트로

경로 식 단계에서 노드 이름을 노드 테스트로 지정할 때 주 노드 종류의 개념을 이해해야 합니다. 모든 축, 자식, 부모 또는 특성에는 주 노드 종류가 있습니다. 예시:

  • 특성 축에는 특성만 포함될 수 있습니다. 따라서 특성 노드는 특성 축의 주 노드 종류입니다.

  • 기타 축의 경우 축에서 선택한 노드에 요소 노드를 포함할 수 있는 경우 요소는 해당 축의 주 노드 종류입니다.

노드 이름을 노드 테스트로 지정하면 다음 유형의 노드가 반환됩니다.

  • 축의 주 노드 종류인 노드

  • 노드 테스트에 지정된 것과 이름이 같은 노드입니다.

예를 들어 다음 경로 식을 고려합니다.

child::ProductDescription   

이 1단계 식은 축과 노드 이름을 ProductDescription 노드 테스트로 지정합니다child. 식은 자식 축, 요소 노드의 주 노드 종류이며 ProductDescription을 이름으로 갖는 노드만 반환합니다.

경로 식 /child::PD:ProductDescription/child::PD:Features/descendant::*, 에는 세 단계가 있습니다. 이러한 단계에서는 자식 축과 하위 축을 지정합니다. 각 단계에서 노드 이름은 노드 테스트로 지정됩니다. 세 번째 단계의 와일드카드 문자(*)는 하위 축에 대한 원칙 노드 종류의 모든 노드를 나타냅니다. 축의 주 노드 종류는 선택한 노드의 유형을 결정하고 노드 이름은 노드가 선택한 노드를 필터링합니다.

따라서 ProductModel 테이블의 제품 카탈로그 XML 문서에 대해 이 식이 실행되면 ProductDescription> 요소의 Features> 요소 노드 자식 요소<의 모든 요소 노드 자식을 <검색합니다.

경로 식 /child::PD:ProductDescription/attribute::ProductModelID은 두 단계로 구성됩니다. 두 단계 모두 노드 이름을 노드 테스트로 지정합니다. 또한 두 번째 단계에서는 attribute 축을 사용합니다. 따라서 각 단계에서는 이름이 노드 테스트로 지정된 축의 주 노드 종류의 노드를 선택합니다. 따라서 식은 ProductDescription 요소 노드의 <ProductModelID 특성 노드를> 반환합니다.

노드 테스트에 대해 노드의 이름을 지정할 때 다음 예에서처럼 와일드카드 문자(*)를 사용하여 노드의 로컬 이름 또는 그 네임스페이스 접두사를 지정할 수 있습니다.

declare @x xml  
set @x = '  
<greeting xmlns="ns1">  
   <salutation>hello</salutation>  
</greeting>  
<greeting xmlns="ns2">  
   <salutation>welcome</salutation>  
</greeting>  
<farewell xmlns="ns1" />'  
select @x.query('//*:greeting')  
select @x.query('declare namespace ns="ns1"; /ns:*')  

노드 형식을 노드 테스트로

요소 노드 이외의 노드 형식을 쿼리하려면 노드 형식 테스트를 사용합니다. 다음 표와 같이 4개의 노드 유형 테스트를 사용할 수 있습니다.

Node 형식 반품 예시
comment() 주석 노드의 경우 True입니다. following::comment() 는 컨텍스트 노드 뒤에 표시되는 모든 주석 노드를 선택합니다.
node() 모든 종류의 노드에 대해 True입니다. preceding::node() 는 컨텍스트 노드 앞에 표시되는 모든 노드를 선택합니다.
processing-instruction() 처리 명령 노드의 경우 True입니다. self::processing instruction() 는 컨텍스트 노드 내의 모든 처리 명령 노드를 선택합니다.
text() 텍스트 노드에 대해 True child::text() 는 컨텍스트 노드의 자식인 텍스트 노드를 선택합니다.

text() 또는 comment() ...와 같은 노드 형식이 노드 테스트로 지정되면 단계가 축의 주 노드 종류에 관계없이 지정된 종류의 노드만 반환합니다. 예를 들어 다음 경로 식은 컨텍스트 노드의 주석 노드 자식만 반환합니다.

child::comment()  

마찬가지로 ProductDescription /child::ProductDescription/child::Features/child::comment()> 요소 노드의 <Features> 요소 노드 자식에 대한 <주석 노드 자식을 검색합니다.

예제

다음 예제에서는 노드 이름과 노드 종류를 비교합니다.

A. 경로 식에서 노드 이름 및 노드 형식을 노드 테스트로 지정한 결과

다음 예제에서는 간단한 XML 문서가 xml 형식 변수에 할당됩니다. 문서는 다른 경로 식을 사용하여 쿼리됩니다. 그런 다음 결과를 비교합니다.

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
select @x.query('  
/child::a/child::b/descendant::*  
')  

이 식은 요소 노드의 하위 요소 노드를 <b> 요청합니다.

노드 테스트의 별표(*)는 노드 이름에 대한 와일드카드 문자를 나타냅니다. 하위 축에는 요소 노드가 주 노드 종류로 있습니다. 따라서 식은 요소 노드 <b>의 모든 하위 요소 노드를 반환합니다. 즉, 요소 노드와 <c> <d> 다음 결과에 표시된 대로 반환됩니다.

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

하위 축을 지정하는 대신 하위 축 또는 자체 축을 지정하면 컨텍스트 노드와 해당 하위 항목도 반환됩니다.

/child::a/child::b/descendant-or-self::*  

이 식은 요소 노드 <b> 와 해당 하위 요소 노드를 반환합니다. 하위 노드를 반환할 때 하위 또는 자체 축의 주 노드 종류인 요소 노드 형식은 반환되는 노드 종류를 결정합니다.

다음은 결과입니다.

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

이전 식은 와일드카드 문자를 노드 이름으로 사용했습니다. 대신 이 식에 node() 표시된 것처럼 함수를 사용할 수 있습니다.

/child::a/child::b/descendant::node()  

node() 노드 형식이므로 하위 축의 모든 노드를 받게 됩니다. 다음은 결과입니다.

text1  
<c>text2  
     <d>text3</d>  
</c>  
text2  
<d>text3</d>  
text3  

또한 하위 축 또는 자체 축을 지정하고 node() 노드 테스트로 모든 하위 항목, 요소 및 텍스트 노드와 컨텍스트 노드, <b> 요소를 받게 됩니다.

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
text1  
<c>text2  
     <d>text3</d>  
</c>  
text2  
<d>text3</d>  
text3  

B. 노드 테스트에서 노드 이름 지정

다음 예제에서는 노드 이름을 모든 경로 식에서 노드 테스트로 지정합니다. 그 결과 모든 식에서 노드 테스트에 지정된 노드 이름이 있는 축에 대한 주 노드 종류의 노드를 반환합니다.

다음 쿼리 식은 테이블에 저장된 Production.ProductModel 제품 카탈로그 XML 문서의 요소를 반환><Warranty합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::PD:Features/child::wm:Warranty  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

이전 쿼리의 다음 사항에 유의하세요:

  • XQuery 프롤로그의 namespace 키워드는 쿼리 본문에 사용되는 접두사를 정의합니다. XQuery 프롤로그에 대한 자세한 내용은 XQuery 프롤로그를 참조하세요.

  • 경로 식의 세 단계 모두 자식 축과 노드 이름을 노드 테스트로 지정합니다.

  • 축 단계의 선택적 단계 한정자 부분은 식의 단계에 지정되지 않았습니다.

쿼리는 요소 자 <Warranty> 식 요소의>Features< 요소 자식을 반환합니다.<ProductDescription>

다음은 결과입니다.

<wm:Warranty xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
  <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>  
  <wm:Description>parts and labor</wm:Description>  
</wm:Warranty>     

다음 쿼리에서 경로 식은 노드 테스트에서 와일드카드 문자(*)를 지정합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::PD:Features/child::*  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

와일드카드 문자는 노드 이름에 대해 지정됩니다. 따라서 쿼리는 요소 노드의 요소 노드 자식 요소 <Features> 의 모든 요소 노드 자식을 반환합니다.<ProductDescription>

다음 쿼리는 이전 쿼리와 비슷하지만 와일드카드 문자와 함께 네임스페이스가 지정되어 있다는 점이 다릅니다. 따라서 해당 네임스페이스의 모든 요소 노드 자식이 반환됩니다. 요소에는 <Features> 다른 네임스페이스의 요소가 포함될 수 있습니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::PD:Features/child::wm:*  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

이 쿼리에 표시된 대로 네임스페이스 접두사로 와일드카드 문자를 사용할 수 있습니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::PD:Features/child::*:Maintenance  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

이 쿼리는 <Maintenance> 제품 카탈로그 XML 문서의 모든 네임스페이스에 있는 요소 노드 자식을 반환합니다.

C. 노드 테스트에서 노드 종류 지정

다음 예에서는 모든 경로 식에서 노드 테스트로 노드 종류를 지정합니다. 결과적으로 모든 식은 노드 테스트에 지정된 종류의 노드를 반환합니다.

다음 쿼리에서 경로 식은 세 번째 단계에서 노드 종류를 지정합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::PD:Features/child::text()  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

다음 쿼리에서는 다음이 지정됩니다.

  • 경로 식에는 슬래시 표시(/)로 구분되는 세 가지 단계가 있습니다.

  • 이러한 각 단계는 자식 축을 지정합니다.

  • 처음 두 단계에서는 노드 이름을 노드 테스트로 지정하고, 세 번째 단계에서는 노드 종류를 노드 테스트로 지정합니다.

  • 식은 요소 노드의 요소 자식에 대한 <Features> 텍스트 노드 자식을 반환합니다.<ProductDescription>

하나의 텍스트 노드만 반환됩니다. 다음은 결과입니다.

These are the product highlights.   

다음 쿼리는 요소의 주석 노드 자식을 반환합니다 <ProductDescription> .

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::PD:ProductDescription/child::comment()  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

이전 쿼리의 다음 사항에 유의하세요:

  • 두 번째 단계에서는 노드 종류를 노드 테스트로 지정합니다.

  • 결과적으로 식은 요소 노드의 <ProductDescription> 주석 노드 자식을 반환합니다.

다음은 결과입니다.

<!-- add one or more of these elements... one for each specific product in this product model -->  
<!-- add any tags in <specifications> -->      

다음 쿼리는 최상위 처리 명령 노드를 검색합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::processing-instruction()  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

다음은 결과입니다.

<?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>   

문자열 리터럴 매개 변수를 노드 테스트에 processing-instruction() 전달할 수 있습니다. 이 경우 쿼리는 이름 특성 값이 인수에 지정된 문자열 리터럴인 처리 명령을 반환합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
 /child::processing-instruction("xml-stylesheet")  
')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

구현 제한 사항

다음은 특정 제한 사항입니다.

  • 확장된 SequenceType 노드 테스트는 지원되지 않습니다.

  • processing-instruction(name)은 지원되지 않습니다. 대신 이름을 따옴표로 묶습니다.