1

私はこのようなXMLファイルを持っています:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT family (person)+>
<!ELEMENT person (name) >
<!ATTLIST person idnum ID #REQUIRED
gender (male | female) #REQUIRED
father IDREF #IMPLIED
mother IDREF #IMPLIED
children IDREFS #IMPLIED >
<!ELEMENT name (#PCDATA)>

<?xml version="1.0"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family>
<person idnum = "T11" gender = "male" children ="T13 T14 T15"><name>11</name></person>
<person idnum = "T12" gender = "female" children ="T13 T14 T15"><name>12</name></person>
<person idnum = "T13" gender = "male" father="T11" mother="T12"><name>13</name></person>
<person idnum = "T14" gender = "male" father="T11" mother="T12"><name>14</name></person>
<person idnum = "T15" gender = "female" father="T11" mother="T12" children="T33"><name>15</name></person>
<person idnum = "T21" gender = "male" children="T23"><name>21</name></person>
<person idnum = "T22" gender = "female" children="T23"><name>22</name></person>
<person idnum = "T23" gender = "male" father="T21" mother="T22" children="T33"><name>23</name></person>
<person idnum = "T33" gender = "female" father="T23" mother="T15"><name>33</name></person>
</family>

クエリを確認したい:

  1. 子供がいないすべての人(male&の両方female

  2. 男性の子供がいないすべての人々(すなわちSONS

私はもう試した :

  1. /family/person[count(children)==0]

  2. /family/person[count(children)==0 and children!=male]

しかし、それは機能しません。

説明してもらえますか?ありがとう 。

4

3 に答える 3

2

XPathのequals演算子は、「==」ではなく「=」です。

子供を書く!=男性はおそらく希望的観測でした、あなたはそれがうまくいくとは本当に想像していなかったでしょう、私は願っています。

おそらく、子供がいない人は、@ children属性がないか、属性は存在するが空白であるかのいずれかで表される可能性があります。テストすることで、最初のクエリの両方のケースをカバーできます/family/person[normalize-space(@children)='']

2番目のクエリは、結合を伴うため、より困難です。XPath 1.0は、すべての結合クエリを処理できるわけではありません。XPath2.0はできます。どちらを使用しているのかはわかりません。もう1つの厄介な問題は、id()関数が少し不安定になる可能性があることです。処理パイプラインは、どの属性がIDであるかに関する情報を常に保持するとは限りません。ただし、id()がご使用の環境で機能すると仮定すると、2番目のクエリ(XPath 1.0または2.0のいずれか)を次のように実行できます。

/family/person[not(id(@children)[@gender='male'])]
于 2012-05-24T09:55:45.290 に答える
1

これらのxpathは正しくありません。あなたは子要素を見つけようとしていますが、それらは属性です。

次のようになります。

//person[not(@children)]
于 2012-05-24T09:02:31.037 に答える
1
  1. xml-tagのように「person」を使用しますが、そのtag-attributeです。したがって、@childrenを使用する方がよいでしょう。
  2. 子という名前の属性が1つしかないため、count(@children)の使用は機能しません。
  3. 属性値から文字列をスプライスしてカウントすることはできません
于 2012-05-24T09:05:05.363 に答える