次の 2 種類の要素を含む XML ファイルがあります。
<team name="n1" coach="c1"></team>
<game teams="t1 t2" winner="t2"></game>
試合に勝てていないすべてのチームのコーチを選びたいです。私が試したことは
//team[count(//game[@winner=@name])=0]/@coach
しかし、うまくいきません。
次の 2 種類の要素を含む XML ファイルがあります。
<team name="n1" coach="c1"></team>
<game teams="t1 t2" winner="t2"></game>
試合に勝てていないすべてのチームのコーチを選びたいです。私が試したことは
//team[count(//game[@winner=@name])=0]/@coach
しかし、うまくいきません。
試す
//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
やり過ぎに見えるかもしれませんが、MS SQL 2005/2008 Express を使用して xpath をテストできます。または、http://sqlfiddle.comを使用してオンラインでテストすることもできます。
次の例を参照してください。
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" />