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
Jayy 17 październik 2012, 18:41

2 odpowiedzi

Najlepsza odpowiedź

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()]
1
Dimitre Novatchev 17 październik 2012, 20:44

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.

3
choroba 17 październik 2012, 19:14