【问题标题】:Find parent with single child with the same name查找具有相同名字的单个孩子的父母
【发布时间】:2011-11-27 14:57:44
【问题描述】:

假设我有以下 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) 会验证测试。值得一提的是,除了儿子、女儿、父母和名字之外,我可能还有很多其他的元素。

【问题讨论】:

  • 第一个parent name 是“Luiz”怎么样?它只有一个与自己同名的孩子?您是否要排除它,因为有一个名称不同的 daughter
  • 是的,我需要能够判断是否只有一个孩子(无论是儿子还是女儿),并且这个孩子是以其父母的名字命名的。

标签: xml xpath


【解决方案1】:

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

使用

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

这会选择顶部元素的所有名为parent 的子元素,只有一个子元素(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>

【讨论】:

  • 这对我不起作用,正如我上面所说的:“值得一提的是,除了儿子、女儿、父母和名字。”
  • 好的,那么你可以做一些事情来提供一个更现实的例子。查看更新后的答案。
  • 这确实有效,我遇到了死胡同,因为我试图获取节点,然后计算结果,然后获取名称......谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2013-06-23
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多