1

我在这个 XML 上做出了不同的选择,但对于大多数人来说,我不确定我是否完成了最简单的解决方案,并且对于其中两个我无法提供有效的解决方案。

<?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]
  • 选择所有祖父母的女性或男性:我完全被这个困住了,我看不出我怎么能在这么多未知的情况下选择。在我看来是这样的://*/*/*/*。. . 我不明白如何开始。
4

2 回答 2

3

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

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

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

//*[(self::man or self::woman) and */*/*/*]
于 2013-01-23T01:52:06.883 回答
1

为了更容易选择所有祖父母的女性或男性,您可以使用“自我”声明性XPath 来选择多个标签

//*[count(*[self::sons or self::daughters]/*[self::man or self::woman]/*[self::sons or self::daughters]/*[self::man or self::woman]) >= 1]
于 2013-01-22T22:52:09.030 回答