2

すべての子要素ノード名が同じである親ノードを選択するにはどうすればよいですか。<a id="1">次の例では、すべての子ノード名が次のようになっているため、親ノードを選択する必要があります。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>
4

2 に答える 2

3

次のXPath式を試してください。

//*[./* and not(./*[name() != name(../*[1])])] 

子を持つ要素を選択しますが、子の名前は最初の子の名前と異なりません。

formすべての子に名前が付けられているため、これも返されますa

于 2012-10-17T15:14:51.180 に答える
1

I. XPath 1.0

使用

/*/*
   [not(*[position() > 1
      and
          not(name()= name(../*[1]))
         ]
        )
    ]

これにより、最上位の要素の子要素が選択position()され、1より大きい子要素の名前が、その要素の最初の子の名前と等しくなります。

説明

二重否定法の適切な使用。

XSLTベースの検証

<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>

この変換が提供された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>

XPath式が評価され、選択された要素(この場合は1つだけ)が出力にコピーされます

<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()]
于 2012-10-17T16:30:58.800 に答える