6

次のXMLを検討してください--

<div id="test">
    <p> Text sihdfaif</p>
    <p />
    <p> Text sihdfaif</p>
    <p />
    <p> Text sihdfaif</p>
    <p> Text sihdfaif</p>
    <p> Text sihdfaif</p>
</div>

ここで、テキストが含まれているp要素の数を取得したいと思います。この場合、その値= 5(空の2つの'p'要素があります)

これは私が思いついたXQueryです-

    let $claims_main := $doc//div[@id="test"]
        let $claims := $doc//div[@id="test"]/p
        let $n := count($claims)
        where $claims_main/p != '' 
        return $n

ただし、上記から得られる結果は7です。つまり、空の'p'要素が含まれています。

私が考えた別の方法は、すべての「p」要素に対してforループを使用することですが、その場合、ループの要素の総数を取得するにはどうすればよいですか?その場合にcountを使用すると、単に[1,1,1,1,1]-を取得します。各p要素のカウント(forループでは、カウントはdiv自体ではなく、「p」要素のそれぞれに対して行われるため)。..

4

2 に答える 2

10

質問が具体的に「pテキストを含む要素」を求めているpため、そのような要素の数を正確に取得する方法は次のとおりです。

count(/*/div/p[string(.)])

これにより、XML ドキュメントの最上位要素の子である の子であるp、空でない文字列値を持つすべての要素の数が生成されます。div

さらに、「空でない」とは、空白のみの文字列値がないことも意味する場合:

count(/*/div/p[normalize-space(.)])
于 2012-09-16T16:13:17.650 に答える
1

これを試して:

count($doc//div[@id='test']/p[node()])

2番目の述語[node()]は、子ノードを含む要素のみを選択します。これは、と同等[./node()]です。

于 2012-09-16T11:06:39.510 に答える