Jak mogę wybrać węzły nadrzędne, dla których wszystkie nazwy węzłów elementów podrzędnych są takie same. W poniższym przykładzie należy wybrać węzeł nadrzędny <a id="1">
, ponieważ wszystkie nazwy węzłów podrzędnych to b
<form>
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
<a id="2">
<b>1</b>
<c>2</c>
<b>3</b>
</a>
</form>
2 odpowiedzi
I. XPath 1.0:
użyj :
/*/*
[not(*[position() > 1
and
not(name()= name(../*[1]))
]
)
]
To wybiera dowolny element potomny górnego elementu, tak że nazwa dowolnego elementu potomnego z position()
większym niż jeden, jest równa nazwie pierwszego dziecka tego elementu.
Wyjaśnienie :
Właściwe korzystanie z prawa o podwójnej negacji.
XSLT - weryfikacja :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:copy-of select=
"/*/*
[not(*[position() > 1
and
not(name()= name(../*[1]))
]
)
]"/>
</xsl:template>
</xsl:stylesheet>
Gdy transformacja jest stosowana na dostarczonym dokumencie XML:
<form>
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
<a id="2">
<b>1</b>
<c>2</c>
<b>3</b>
</a>
</form>
wyrażenie XPath jest oceniane, a wybrane elementy (w tym przypadku tylko jeden) są kopiowane do wyjścia:
<a id="1">
<b>1</b>
<b>2</b>
<b>3</b>
</a>
II. XPath 2.0:
/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]
Wypróbuj następującą ekspresję XPath:
//*[./* and not(./*[name() != name(../*[1])])]
Wybiera dowolny element, który ma dzieci, ale nazwa żadnego z nich nie różni się od imienia pierwszego dziecka.
Zwraca również form
, ponieważ wszystkie jego dzieci są nazwane a
.
Podobne pytania
Nowe pytania
xml
XML (Extensible Markup Language) to ustrukturyzowany format dokumentu definiujący zasady kodowania tekstu. Używając tego znacznika, należy uwzględnić dodatkowe znaczniki, takie jak język programowania, zestawy narzędzi, używane technologie XML i inne znaczniki opisujące środowisko, w którym pojawił się problem. Elastyczność XML nadaje się do szerokiej gamy zastosowań do przesyłania danych przez ludzi i maszyny, dlatego należy być konkretnym, jeśli chodzi o narzędzia i biblioteki.