XPath选择具有不同名称的同级节点

时间:2013-01-22 22:41:36

标签: xml xpath

我正在对这个XML做出不同的选择,但对于大多数人来说,我不确定我是否做了最简单的解决方案,其中2个我无法提供可行的解决方案。

<?xml version="1.0" ?>
<!DOCTYPE list[
<!ELEMENT list(man|woman)*>
<!ELEMENT man(sons,daughters)>
<!ATTLIST man name CDATA #REQUIRED>
<!ELEMENT man(sons,daughters)>
<!ATTLIST woman name CDATA #REQUIRED>
<!ELEMENT sons(man)*>
<!ELEMENT daughters(woman)*>

<list>
    <man name="Jean-Bernard">
        <sons>
            <man name="Marc-Antoine"/>
        </sons>
        <daughters>
            <woman name="Marie-Jeanne">
                <sons/>
                <daughters>
                    <woman name="Anne-Sophie"/>
                </daughters>
            </woman>
            <woman name="Rose-Marie">
                <daughters>
                    <woman name="Marie-Cécile"/>
                </daughters>
            </woman>
        </daughters>
    </man>
    <woman name="Marie-Jeanne">
        <sons>
            <man name="Ghislain-Auguste">
                <sons/>
            </man>  
        </sons>
        <daughters>
            <woman name="Rita-Lise">
            <sons>
                <man name="Alain-Luc"/>
                <man name="Jules-Edouard"/>
            </sons>
            </woman>
        </daughters>
    </woman>
</list>

我做了什么:

  • 选择所有女性://woman
  • 选择名为“Marie Jeanne”的所有女性://woman[@name='Marie-Jeanne']
  • 选择名称中包含“Marie”的所有女性://woman[contains(@name,Marie)]

我做了什么,但这不完全或我认为它可以更好:

  • 选择所有至少有2个孩子的女性或男性://*[sum(count(sons/man), count(daughters/woman)) >= 2]
  • 选择所有作为祖父母的女性或男性:我完全陷入困境,我无法看到我如何选择这么多未知数。在我看来,这就是://*/*/*/*。 。 。我不明白如何开始。

2 个答案:

答案 0 :(得分:3)

  

选择所有至少有2个孩子的女性或男性:

//*[(self::man or self::woman) and count(*/*) > 1]

  

选择所有祖父母的女性或男性

//*[(self::man or self::woman) and */*/*/*]

答案 1 :(得分:1)

为了更容易选择所有祖父母的女性或男性,您可以使用“自我”声明XPath to select multiple tags

//*[count(*[self::sons or self::daughters]/*[self::man or self::woman]/*[self::sons or self::daughters]/*[self::man or self::woman]) >= 1]