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

一、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 表达式求值,并将所选元素(在本例中只有一个)复制到输出

<a id="1">
   <b>1</b>
   <b>2</b>
   <b>3</b>
</a>

二、XPath 2.0

/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]
于 2012-10-17T16:30:58.800 回答