2

あけましておめでとうございます!

BaseXでXQuery を学習していて、現在次の問題に直面しています。

ディストリビューションの一部であるfactbook.xmlファイルを解析しています。

次のクエリは正常に実行されます。

 for $country in db:open('factbook')//country
 where $country/@population < 1000000 and $country/@population > 500000
 return <country name="{$country/name}" population="{$country/@population}">
 {
   for $city in $country/city
   let $pop := number($city/population)
   order by $pop descending
    return <city  population="{$city/population/text()}"> {$city/name/text()}
    </city>
 }
 </country>

"{$country/@population}"しかし、2 番目のクエリを実行する html を生成しようとしているときに、タグにを入れようとすると、<h2>Country population: </h2>「属性はルート要素に従う必要があります」というエラー メッセージが表示されます。

 <html><head><title>Some Countries</title></head><body>
 {
  for $country in db:open('factbook')//country
 let $pop_c := $country/@population
 where $pop_c < 1000000 and $pop_c > 500000
 return
 <p>
 <h1>Country: {$country/name/text()}</h1>
 <h2>Country population: #error comes if I put it here!#</h2>
 {
 for $city in $country/city
 let $pop := number($city/population)
 order by $pop descending
 return ( <h3>City: {$city/name/text()}</h3>,
 <p>City population: {$city/population/text()}</p>
 )
 }
 </p>
 }
 </body></html>

私の間違いはどこですか?ありがとうございました!

4

2 に答える 2

4

ちょうど使用:

{$country/@population}

結果の属性人口をコピーします。属性は要素 (または要素に続く他の属性) の直後に続く必要がありますが、これはテキスト ノードの後に​​続くため、エラーが発生します。

使用:

<h2>Country population: {string($country/@population)} </h2>
于 2013-01-01T18:48:27.217 に答える
1

{$country/@population} と記述する場合、人口属性のテキストを挿入するのではなく、属性自体を挿入します。「その前に国の人口テキスト」がなかった場合、 {$country/@population} を使用すると、`のようなものが作成されます

その値が必要な場合は、次を使用します。

{data($country/@population)}

または

{data($pop_c)}

すでに変数に含まれているためです。(数値関数や文字列関数もデータの代わりに使えますが、データが一番速いと思います)

于 2013-01-01T12:44:15.583 に答える