2010-06-11 7 views
25

değerlerinde olup olmadığını bulmak için XPath 1.0 Bir öğenin değerinin önceden tanımlanmış bir değerler listesinde olup olmadığını değerlendiren bir XPath oluşturmanın bir yolu var mı? Buna benzer bir şey:Bir öğenin değerinin

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

Bu düğüm, Texas, Alabama veya Massachusetts için Eyalet öğeleri neydi? Ben ifadeyi paketten biliyorum:

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

Ama XPath'ler oldukça uzun olduğundan değerler listesidir olarak bu, biraz hantal.

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

Yoksa gerçekten uzun bir liste varsa, yaratabilirsiniz: Aynı köşeli parantez içindeki birden çok koşul kontrol edebilirsiniz

cevap

43

Benim google-fu ... konuyla ilgili pek dönüm değil Durum listesi ve işlevini kullanın.

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

Bu, iki harfli durum kısaltmaları için iyi çalışır. Daha uzun dizeler için daha sağlam yapmak isterseniz, uçlara biraz boşluk ekleyebilir ve _TX_, _AL_, vb. (Alt çizgiların boşluk olduğu yerlerde) kontrol edebilirsiniz.

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

Sadece necromancing, XPath 2.0 geldiğinden beri.

XPath 2.0 ile bunu yapabilirsiniz:

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

Alternatif XPath 1.0 ile, sen dize uzunluğu ile birlikte içerdiği kullanabilirsiniz