查找具有相同名称的单个子项的父项

时间:2011-11-27 14:57:44

标签: xml xpath

假设我有以下XML:

<root>
 <parent>
  <name>Luiz</name>
  <son><name>Luiz</name</son>
  <daugther><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Cristina</name>
  <daugther><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Carolina</name>
  <daugther><name>Cristina</name></daughter>
 </parent>
</root>

我可以使用什么XPath来测试父级,以查看它是否只有一个与其自身名称相同的子级(子元素或子元素)。在上面的例子中,只有第二个父母(Cristina)会验证测试。值得一提的是,除了儿子,女儿,父母和名字,我可能还有许多其他元素。

1 个答案:

答案 0 :(得分:1)

  

我可以使用什么XPath来测试父母,看看它是否只有一个孩子   (元素儿子或女儿)与自己的名字相同。

使用

         /*/parent
               [count(*[self::daughter or self::son]) =1
              and
                name = *[self::daughter or self::son]/name
               ]

这将选择名为parent的top元素的所有子元素,只有一个子元素(name子元素除外),并且它们的name子元素的字符串值相同作为其他(非name)孩子的name孩子的字符串值。

基于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=
         "/*/parent
               [count(*[self::daughter or self::son]) =1
              and
                name = *[self::daughter or self::son]/name]
        "/>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档(纠正了大量错误以使其格式正确):

<root>
 <parent>
  <name>Luiz</name>
  <son><name>Luiz</name></son>
  <daughter><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Cristina</name>
  <daughter><name>Cristina</name></daughter>
 </parent>
 <parent>
  <name>Carolina</name>
  <daughter><name>Cristina</name></daughter>
 </parent>
</root>

它评估XPath表达式并输出所有选定的节点(在这种情况下只有一个):

<parent>
   <name>Cristina</name>
   <daughter>
      <name>Cristina</name>
   </daughter>
</parent>