expressions - XPath 1.0 para encontrar si el valor de un elemento está en una lista de valores
xpath position (2)
¿Hay alguna manera de construir un XPath que evalúe si el valor de un elemento está en una lista predefinida de valores? Algo parecido a esto:
/Location/Addr[State=''TX or AL or MA'']
¿Cuál combinaría nodos con elementos estatales para Texas, Alabama o Massachusetts? Sé que puedo descomprimir la expresión:
/Location/Addr[State=''TX] or /Location/Addr[State=''AL''], etc...
Pero esto es un poco engorroso ya que los xpaths son bastante largos, como lo es la lista de valores. Mi google-fu no está apareciendo demasiado sobre el tema ...
Puede verificar múltiples condiciones dentro de los mismos corchetes:
/Location/Addr[State=''TX'' or State=''AL'' or State=''MA'']
O si tiene una lista realmente larga, puede crear una lista de estados y usar la función contains()
.
/Location/Addr[contains(''TX AL MA'', State)]
Esto funcionará bien para las abreviaturas de estado de dos letras. Si desea que sea más robusto para cadenas más largas, podría agregar espacios en las puntas y verificar por _TX_
, _AL_
, etc. (donde los guiones bajos son espacios).
/Location/Addr[contains('' TX AL MA '', concat('' '', State, '' ''))]
Simplemente nigromancia, ya que XPath 2.0 ha llegado.
Con XPath 2.0, puedes hacer:
/Location/Addr[State=(''TX'', ''AL'', ''MA'')]
Alternativamente, con XPath 1.0, puede usar contiene en combinación con string-length:
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;