2010-06-11 3 views
25

요소의 값이 미리 정의 된 값 목록에 있는지 여부를 평가하는 XPath를 구성하는 방법이 있습니까? 이것과 비슷한 것 :요소의 값이 값 목록에 있는지 확인하는 XPath 1.0

/Location/Addr[State='TX or AL or MA'] 

Texas, Alabama 또는 Massachusetts의 주 요소와 일치하는 노드는 어느 것입니까? 내가 표현 압축을 풀 수 있다는 사실을 알고 :

/Location/Addr[State='TX] or /Location/Addr[State='AL'], etc... 

을하지만 XPath의 매우 긴 때문에 값 목록이기 때문에이 조금 복잡합니다.

/Location/Addr[State='TX' or State='AL' or State='MA'] 

아니면 정말 긴 목록이있는 경우, 당신이 만들 수 있습니다 당신은 같은 대괄호 안에 여러 조건을 확인할 수 있습니다

답변

43

내 구글-FU는 ...이 문제에 많이 온되지 않는다 상태 목록은 기능을 사용합니다.

/Location/Addr[contains('TX AL MA', State)] 

두 글자 상태의 약어로는 잘 작동합니다. 긴 문자열에 대해 더 강력하게 만들려면 끝에 공백을 추가하고 _TX_, _AL_ 등 (밑줄은 공백 임)을 확인하십시오.

/Location/Addr[contains(' TX AL MA ', concat(' ', State, ' '))] 
3

XPath 2.0이 출시되었습니다.

의 XPath 2.0, 당신이 할 수 있습니다

declare @tXML xml = '<svg> 
<g> 
<path></path> 
<path data-objid="0000X1"></path> 
<path data-objid="0000X2"></path> 
<path data-objid="0000X3"></path> 
</g> 
</svg>'; 

-- select @tXML; 

SELECT 
    c.p.value('(@data-objid)[1]', 'varchar(50)') AS 'DocumentID' 
FROM @tXML.nodes('//node()[contains("0000X1,0000X2", @data-objid) and string-length(@data-objid) != 0]') AS c(p) 


set @tXML.modify('delete //node()[contains("0000X1,0000X2", @data-objid) and string-length(@data-objid) != 0]'); 

select @tXML; 
:

/Location/Addr[State=('TX', 'AL', 'MA')] 

또는 XPath를 1.0으로, 당신은 문자열 길이와 함께 포함되어 사용할 수 있습니다

관련 문제