XPath-选择所有未赢得比赛的球队教练

XPath-选择所有未赢得比赛的球队教练,xpath,Xpath,我有一个包含两种类型元素的XML文件: <team name="n1" coach="c1"></team> <game teams="t1 t2" winner="t2"></game> 但它不起作用。试试看 //team[not(@name=//game/@winner)]/@coach 它选择 COACHES OF ANY TEAM //team /@coach THAT

我有一个包含两种类型元素的XML文件:

<team name="n1" coach="c1"></team>

<game teams="t1 t2" winner="t2"></game>
但它不起作用。

试试看

//team[not(@name=//game/@winner)]/@coach
它选择

COACHES OF ANY TEAM
//team                           /@coach
      THAT DOES NOT
      [not(                    )]
           HAVE A @NAME EQUAL TO ANY @WINNER
           @name=//game/@winner

这将为您提供未赢得任何比赛的球队的教练,包括未分配给任何球队的教练

//coach[not(@name=//team[@name=//game/@winner]/@coach)]

我知道这看起来有些过分,但您可以使用MS SQL 2005/2008 Express来测试您的xpath。 或者您可以使用在线测试它

请参见此示例:

DECLARE @xml XML
SET @xml ='<db>
            <team name="chelsea" coach="mourinho"><owner>abramovich</owner><owner>abramovich2</owner></team>
            <team name="arsenal" coach="venger"><owner>poorguy</owner></team>
            <team name="manchester" coach="ferguson"><owner>richguy</owner></team>
            <coach name="mourinho"></coach>
            <coach name="venger"></coach>
            <coach name="ferguson"></coach>
            <coach name="nobody"></coach>
            <game teams="chelsea arsenal" winner="arsenal"></game>
            <game teams="manchester arsenal" winner="manchester"></game>
    </db>'

SELECT 
  name = x.value('@name','varchar(100)')
, element = x.query('.') 
FROM @xml.nodes('//coach[not(@name=//team[@name=//game/@winner]/@coach)]')  AS T(x)

-- OUTPUT
name        element
mourinho    <coach name="mourinho" />
nobody      <coach name="nobody" />

我在这里尝试过:但它似乎不起作用,尽管您的解决方案对我来说很有意义,但我的观点并不重要,因为我已经了解XPath大约3个小时了:@Shmoopy it对我的小测试有效。显然,我让我的测试与你的输入数据不同,有些地方不对劲。您能给我们一个完整的XML示例和预期的输出吗?还有,到底出了什么问题?它是否匹配任何东西,是否抛出错误,是否匹配太多?当然。这和我发布的有点不同,但没什么重要的,我在这里尝试过:@Shmoopy All,然后把穆里尼奥和弗格森还给了我。老实说,我不知道XPath测试床为什么什么都不返回。
DECLARE @xml XML
SET @xml ='<db>
            <team name="chelsea" coach="mourinho"><owner>abramovich</owner><owner>abramovich2</owner></team>
            <team name="arsenal" coach="venger"><owner>poorguy</owner></team>
            <team name="manchester" coach="ferguson"><owner>richguy</owner></team>
            <coach name="mourinho"></coach>
            <coach name="venger"></coach>
            <coach name="ferguson"></coach>
            <coach name="nobody"></coach>
            <game teams="chelsea arsenal" winner="arsenal"></game>
            <game teams="manchester arsenal" winner="manchester"></game>
    </db>'

SELECT 
  name = x.value('@name','varchar(100)')
, element = x.query('.') 
FROM @xml.nodes('//coach[not(@name=//team[@name=//game/@winner]/@coach)]')  AS T(x)

-- OUTPUT
name        element
mourinho    <coach name="mourinho" />
nobody      <coach name="nobody" />