【问题标题】:xpath - why my query does not works?xpath - 为什么我的查询不起作用?
【发布时间】:2013-06-06 02:55:10
【问题描述】:

这是我的 DTD + xml:

<!DOCTYPE test [
  <!ELEMENT team(owner+)>
  <!ATTLIST team
    name ID #REQUIRED
    coach IDREF #REQUIRED
    >
  <!ELEMENT owner      (#PCDATA)>
  <!ELEMENT coach    EMPTY>
  <!ATTLIST coach
    name ID #REQUIRED
    >
  <!ELEMENT game    EMPTY>
  <!ATTLIST game
    teams IDREFS #REQUIRED
    winner IDREF #REQUIRED
    >
  <!ELEMENT db    (coach*,team*,match*)>
]>


<?xml version="1.0" ?> 

    <db>
        <team name = "Hapoel" coach = "Abuksis">
            <owner> Eli Tabib</owner>
        </team>
        <team name = "Maccabi" coach = "Blat">
            <owner> Shimi</owner>
            <owner> Federman</owner>
        </team>
        <team name = "Beitar" coach = "Eli Cohen">
            <owner> Arkadi</owner>
        </team>
        <team name = "ElitzorLavi" coach = "Eli">
            <owner> Zehava</owner>
            <owner> Dani</owner>
        </team>
        <coach name = "Abuksis"/>
        <coach name = "Eli Cohen"/>
        <coach name = "Blat"/>
        <coach name = "Eli"/>
        <game teams = "Hapoel Maccabi" winner = "Maccabi"/>
        <game teams = "Hapoel Beitar" winner = "Beitar"/>
        <game teams = "Maccabi ElitzorLavi" winner = "Maccabi"/>
        <game teams = "Elitzor Lavi Maccabi" winner = "Maccabi"/>
    </db>

我必须找到球队数量小于 2 的比赛。 现在我希望只得到第一场比赛。 我试过这个 Xpath: 数据库/游戏[计数(/@teams)

【问题讨论】:

    标签: xml database xpath dtd


    【解决方案1】:

    您的 xpath 中有几个问题。您应该使用/ 分隔元素和属性。 ./@name 只能缩写为 @name。另外,如果你想得到名字作为结果,你必须在最后使用/@name

    db/team[count(owner)>1][not(@name=//game/@winner)]/@name
    

    【讨论】:

    • 还没有工作。而且似乎对于属性,您不必使用'/'
    • @user2456731:您没有使用标准 XPath。我的解决方案适合我。
    • 谢谢。所以它几乎是好的。现在有趣的是为什么它在 bit-101.com/xpath/ 中不起作用。
    • 我必须找到球队数量小于 2 的比赛。现在我希望没有游戏。我试过这个 Xpath: db/game[count(/@teams)
    • @user2456731:count(@teams),你没有计算真正的团队,你计算的是名为 teams 的属性。每个game 元素都有一个这样的属性。
    【解决方案2】:

    问:我必须找到拥有不止一个老板并且从未赢过比赛的球队。

    试试:

    db/team[count(owner)>1][not(@name = //game/@winner)]
    

    【讨论】:

    • 谢谢,还是不行。当我尝试 db/team[count(owner)>1] 时,我得到了两个团队(Maccabi 和 ElizurLavi),所以问题是没有胜利。
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多