2

SQLで「ALL」キーワードとともにネストされたクエリを使用するのと同等のXPATH1.0は何でしょうか。たとえば、次のスニペットについて考えてみます。

<parent> a <child gender = "male">b</child>
<child gender = "female>c</child></parent>
<parent> z <child gender = "male"> y </child></parent>

すべての子が性別="男性"であるノードを取得するにはどうすればよいですか。これは、SQLで、子の性別を返すサブクエリを記述し、それをALLキーワードでネストして、すべての子が男性であるかどうかを確認することで実行できます。

Q2また、子供が1人だけのすべての親を取得するにはどうすればよいですか。また、親が他のノードを持っている可能性があることも考慮してください。子供の数を数える親は「子供」という名前を持っており、子供が問題について考えている方法であるかどうかを確認しています。それが最善の方法ですか、それとももっと良い方法がありますか?

注:私の課題では、同様のクエリを必要とする問題に直面しています。私は自分で答えを見つけようとしましたが、できませんでした。助けてください

4

3 に答える 3

1

ALL:子供はいるが、男性以外の性別の子供がいない親を選択します。

//parent[child and not child[@gender!="male"]]

男性の子供が1人だけいる親の選択-男性の子供が1人だけいる親を選択します。

//parent[count(child)=1 and child[@gender="male"]]
于 2012-10-14T22:09:09.053 に答える
1
How should i retrieve nodes where ALL children have gender = "male". 

使用:

/*/parent[child
        and
          (not(child[not(@gender) or not(@gender='male')]))
         ]

これにより、次のすべてのparent要素が選択されます。

  1. XML ドキュメントの最上位要素の子であり、かつ

  2. 子供がいchildて、

  3. すべてのchild子がgender属性を持ち、

  4. すべてchildの子供のgender属性が「男性」の文字列値を持つもの

ここでは、非常に一般的で便利な二重否定の法則を使用しました。

2 番目の質問:

Q2 また、子供が 1 人だけ (男性) のすべての親を取得するにはどうすればよいですか。

使用:

/*/parent[child[@gender='male']
        and
          not(child[2])
         ]

これにより、以下が選択されます

  1. parentXML ドキュメントの最上位要素の子である任意の要素、および

  2. 属性の文字列値が「male」であるchild子があり、かつgender

  3. childそれは二人目の子供がいません。

XSLT ベースの検証:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
  <xsl:copy-of select=
  "/*/parent[child
           and
            (not(child[not(@gender) or not(@gender='male')]))
            ]"/>
  ==========

  <xsl:copy-of select=
  "/*/parent[child[@gender='male']
           and
             not(child[2])
            ]"/>

 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメント(より代表的なものにするために拡張された、提供されたもの) に適用される場合:

<t>
    <parent> a
        <child gender="male">b</child>
        <child gender="female">c</child>
        <child gender="female">d</child>
    </parent>
    <parent> e
        <child gender="male">f</child>
        <child gender="male">g</child>
        <child gender="female">h</child>
    </parent>
    <parent> z
        <child gender="male">x</child>
        <child gender="male">y</child>
    </parent>
    <parent> t
        <child gender="male">u</child>
    </parent>
</t>

2 つの XPath 式が評価され、これらの評価の結果 (選択された要素) が output にコピーされます

<parent> z
        <child gender="male">x</child>
   <child gender="male">y</child>
</parent>
<parent> t
        <child gender="male">u</child>
</parent>
  ==========

  <parent> t
        <child gender="male">u</child>
</parent>
于 2012-10-14T23:05:19.577 に答える
1

すべての子供の性別が「男性」であるノードを取得するにはどうすればよいですか。

何人かの回答者は、これを少なくとも 1 人の子供がいなければならないことを意味すると解釈しました。しかし、あなたは SQL の ALL 演算子に相当するものを求めました。SQL では (数学的論理のように)、ALL は空のセットに適用されると true を返すと思います。(すべてのユニコーンには 2 つの角があります。ないものを見せてください。)

したがって、あなたの質問に対する厳密な回答は、ディミトレが回答に含めた「子供と」を削除すると思います。しかし、ディミトルは、あなたが求めたものは実際に望んでいたものではないと正しく推測したかもしれません.

于 2012-10-15T07:37:15.230 に答える