Dado este formato de dados simplificado:
<a>
<b>
<c>C1</c>
<d>D1</d>
<e>E1</e>
<f>don't select this one</f>
</b>
<b>
<c>C2</c>
<d>D2</d>
<e>E1</e>
<g>don't select me</g>
</b>
<c>not this one</c>
<d>nor this one</d>
<e>definitely not this one</e>
</a>
Como você selecionar todos os C
s, D
s e E
s que são filhos de B
elementos?
Basicamente, algo como:
a/b/(c|d|e)
Na minha própria situação, em vez de apenas a/b/
, a consulta que antecederam a selecionar aqueles C
, D
, E
nós é realmente muito complexo para que eu gostaria de evitar fazer isso:
a/b/c|a/b/d|a/b/e
Isso é possível?
or
é um operador lógico - opera com dois valores booleanos. O operador de união XPath|
opera em dois conjuntos de nós. Eles são bem diferentes e existem casos de uso específicos para cada um deles. O uso|
pode resolver o problema original, mas resulta em um mais longo e mais complexo e desafiador para entender a expressão XPath. A expressão mais simples nesta resposta, que usa oor
operador produz o conjunto de nós desejado e pode ser especificada no atributo "select" de uma<xsl:for-each>
operação XSLT. Apenas tente.local-name()
está correto apenas se quisermos selecionar todos os elementos com esse nome local, independentemente do espaço para nome do elemento. Esse é um caso muito raro - em geral, as pessoas se preocupam com as diferenças entre:kitchen:table
esql:table
, ou entrearchitecture:column
,sql:column
,array:column
,military:column
Você pode evitar a repetição com um teste de atributo:
Ao contrário da opinião antagônica de Dimitre, o acima não é incorreto no vácuo em que o OP não especificou a interação com espaços para nome. O
self::
eixo é restrito a namespace,local-name()
não é. Se a intenção do OP é capturarc|d|e
independentemente do espaço para nome (o que eu sugiro que seja um cenário provável, dada a natureza OR do problema), é "outra resposta que ainda tem votos positivos" que está incorreta.Você não pode ser definitivo sem definição, embora eu esteja muito feliz em excluir minha resposta como genuinamente incorreta se o OP esclarecer sua pergunta de modo que eu esteja incorreto.
fonte
local-name()
, isso significa que corresponderia a tags com qualquer espaço para nome? Se eu usarself::
, qual namespace teria que corresponder? Como eu corresponderia apenasOhMy:c
?Por que não
a/b/(c|d|e)
? Eu apenas tentei com a biblioteca XML Saxon (envolvida muito bem com algumas qualidades de Clojure), e parece funcionar.abc.xml
é o documento descrito pelo OP.fonte
Não tenho certeza se isso ajuda, mas com o XSL, eu faria algo como:
e esse XPath não selecionará todos os filhos dos nós B:
fonte