Biorąc pod uwagę ten uproszczony format danych:
<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>
Jak wybrałbyś wszystkie C
s, D
s i E
s, które są dziećmi B
elementów?
Zasadniczo coś takiego:
a/b/(c|d|e)
W moim sytuacji, zamiast po prostu a/b/
, zapytanie prowadzące do wyboru tych C
, D
, E
węzły jest rzeczywiście dość skomplikowane, więc chciałbym, aby uniknąć w ten sposób:
a/b/c|a/b/d|a/b/e
czy to możliwe?
or
jest operatorem logicznym - operuje na dwóch wartościach boolowskich. Operator unii XPath|
działa na dwóch zestawach węzłów. Są one zupełnie inne i dla każdego z nich istnieją specyficzne przypadki użycia. Użycie|
może rozwiązać pierwotny problem, ale skutkuje dłuższym i bardziej złożonym oraz trudniejszym do zrozumienia wyrażeniem XPath. Prostsze wyrażenie w tej odpowiedzi, które używaor
operatora, tworzy żądany zestaw węzłów i może być określone w atrybucie „select”<xsl:for-each>
operacji XSLT. Po prostu spróbuj.local-name()
jest poprawne tylko wtedy, gdy chcemy wybrać wszystkie elementy o tej lokalnej nazwie, niezależnie od przestrzeni nazw, w której dany element się znajduje. Jest to bardzo rzadki przypadek - na ogół ludzie przejmują się różnicami między:kitchen:table
isql:table
lub międzyarchitecture:column
,sql:column
,array:column
,military:column
Zamiast tego możesz uniknąć powtórzeń za pomocą testu atrybutów:
W przeciwieństwie do antagonistycznej opinii Dimitre, powyższe nie jest błędne w próżni, w której OP nie określił interakcji z przestrzeniami nazw.
self::
Oś jest nazw restrykcyjne,local-name()
nie jest. Jeśli intencją PO jest przechwytywaniec|d|e
niezależnie od przestrzeni nazw (co sugerowałbym, że jest to prawdopodobny scenariusz, biorąc pod uwagę charakter OR problemu), to jest to „kolejna odpowiedź, która nadal ma kilka pozytywnych głosów”, co jest niepoprawne.Nie możesz być definitywny bez definicji, chociaż jestem bardzo szczęśliwy, że mogę usunąć moją odpowiedź jako naprawdę niepoprawną, jeśli OP wyjaśnia jego pytanie tak, że się mylę.
źródło
local-name()
, czy to oznacza, że dopasuje tagi do dowolnej przestrzeni nazw? Jeśli użyjęself::
, do jakiej przestrzeni nazw musiałaby pasować? Jak bym pasował tylkoOhMy:c
?Dlaczego nie
a/b/(c|d|e)
? Właśnie wypróbowałem z saksońską biblioteką XML (ładnie opakowaną w trochę dobroci Clojure) i wydaje się, że działa.abc.xml
jest dokumentem opisanym przez OP.źródło
Nie jestem pewien, czy to pomoże, ale z XSL zrobiłbym coś takiego:
i czy ten XPath nie wybierze wszystkich elementów podrzędnych węzłów B:
źródło