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>

但是在尝试生成运行第二个查询的 html 时 - 如果我尝试将其放入"{$country/@population}"标记中,<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)}

因为您已经将它放在变量中。(也可以用数字或者字符串函数代替data,不过我觉得data是最快的)

于 2013-01-01T12:44:15.583 回答