xpath父级的所有子元素名称都相同

时间:2012-10-17 14:41:22

标签: xml xpath orbeon

如何选择其所有子元素节点名称相同的父节点。在下面的示例中,应选择父节点<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>

2 个答案:

答案 0 :(得分:3)

尝试以下XPath表达式:

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

它选择任何具有子元素的元素,但它们的名称与第一个孩子的名字不同。

它也返回form,因为它的所有子节点都被命名为a

答案 1 :(得分:1)

<强>予。 XPath 1.0 :

使用

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

这将选择top元素的任何子元素,以使position()大于1的任何子元素的名称等于该元素的第一个子元素的名称。

<强>解释

正确使用 Double-Negation law

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

<强> II。 XPath 2.0

/*/*[every $vChild in * satisfies name($vChild) eq $vChild/../*[1]/name()]