我正在使用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>
我的错误在哪里? 谢谢!
答案 0 :(得分:3)
只需使用:
{$country/@population}
复制结果中的属性。一个属性应该紧跟一个元素(或该元素后面的其他属性) - 但是这个属性跟在文本节点之后,这会导致引发错误。
使用强>:
<h2>Country population: {string($country/@population)} </h2>
答案 1 :(得分:1)
当您编写{$ country / @ population}时,不会插入population属性的文本,而是插入属性本身。如果你没有“之前的国家人口文本”,使用{$ country / @ population}会创建类似`的东西
如果您想要它的值,请使用:
{data($country/@population)}
或
{data($pop_c)}
因为你已经在变量中拥有它了。 (也可以使用数字或字符串函数代替数据,但我认为数据最快)