【问题标题】:For in FLOWR in XQuery在 XQuery 中的 FLOWR 中
【发布时间】:2019-10-01 10:11:00
【问题描述】:

当我们执行时:

let $country := doc("file.xml")/mondial/country
for $co in $country
for $c in $co/province
let $count := count($co/province/city)
where $count > 40
return(<country name="{($co/name)}">{($count)}</country>)

我们得到

<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="France">41</country>
<country name="Spain">65</country>
<country name="Spain">65</country>
<country name="Spain">65</country>
<country name="Spain">65</country>

但是我们只想返回一个国家和它的$count,像这样;

<country name="France">41</country>
<country name="Spain">65</country>

我们认为问题出在“for”上。

我们如何返回一个唯一的行并跳过多个?

评论:

一个小的 XML 输入示例,

 <country car_code="E"
            area="504750"
            capital="cty-Spain-Madrid"
            memberships="org-AfDB org-CAN ">
      <name>Spain</name>
      <localname>el Reino de España</localname>
      <population year="1991" measured="census">38871331</population>
      <population measured="census" year="2001">40847371</population>
      <population measured="census" year="2011">46815916</population>
      <population_growth>0.78</population_growth>
      <infant_mortality>2.7</infant_mortality>
      <gdp_total>1356000</gdp_total>
      <gdp_agri>3.1</gdp_agri>
      <gdp_ind>26</gdp_ind>
      <gdp_serv>70.8</gdp_serv>
      <inflation>1.8</inflation>
      <unemployment>26.3</unemployment>
      <indep_date>1492-01-01</indep_date>
      <government>parliamentary monarchy</government>
      <encompassed continent="europe" percentage="100"/>
      <ethnicgroup percentage="100">Mediterranean Nordic</ethnicgroup>
      <religion percentage="68">Roman Catholic</religion>
      <religion percentage="4.1">Muslim</religion>
      <religion percentage="0.3">Protestant</religion>
      <religion percentage="0.25">Jehovas Witnesses</religion>
      <language percentage="74">Spanish</language>
      <language percentage="19">Catalan</language>
      <language percentage="5">Galician</language>
      <language percentage="2">Basque</language>
      <border country="AND" length="65"/>
      <border country="F" length="623"/>
      <border country="GBZ" length="1.2"/>
      <border country="P" length="1214"/>
      <province id="prov-Spain-2" country="E" capital="cty-Spain-5">
         <name>Andalucía</name>
         <area>87585</area>
         <population measured="census" year="1991">6940105</population>
         <population year="1994">7053043</population>
         <population measured="census" year="2001">7357558</population>
         <population measured="census" year="2011">8371271</population>
         <city id="cty-Spain-5" country="E" province="prov-Spain-2">
            <name>Sevilla</name>
            <name>Seville</name>
            <latitude>37.38</latitude>
            <longitude>-5.99</longitude>
            <elevation>12</elevation>
            <population year="1991" measured="census">701927</population>
            <population year="1994">714148</population>
            <population year="2001" measured="census">684633</population>
            <population year="2011" measured="census">698042</population>
            <located_at watertype="river" river="river-Guadalquivir"/>
         </city>
         <city id="cty-Spain-34" country="E" province="prov-Spain-2">
            <name>Almería</name>
            <latitude>36.84</latitude>
            <longitude>-2.47</longitude>
            <elevation>27</elevation>
            <population year="1991" measured="census">168025</population>
            <population year="1994">167361</population>
            <population year="2001" measured="census">166328</population>
            <population year="2011" measured="census">189680</population>
            <located_at watertype="sea" sea="sea-Mittelmeer"/>
         </city>
         <city id="cty-Spain-39" country="E" province="prov-Spain-2">
            <name>Cádiz</name>
            <latitude>36.53</latitude>
            <longitude>-6.28</longitude>
            <elevation>11</elevation>
            <population year="1991" measured="census">143129</population>
            <population year="1994">155438</population>
            <population year="2001" measured="census">133363</population>
            <population year="2011" measured="census">124014</population>
            <located_at watertype="sea" sea="sea-Atlantic"/>
         </city>
         <city id="cty-Spain-13" country="E" province="prov-Spain-2">
            <name>Córdoba</name>
            <latitude>37.88</latitude>
            <longitude>-4.77</longitude>
            <elevation>120</elevation>
            <population year="1991" measured="census">309961</population>
            <population year="1994">315948</population>
            <population year="2001" measured="census">308072</population>
            <population year="2011" measured="census">328326</population>
            <located_at watertype="river" river="river-Guadalquivir"/>
         </city>
         <city id="cty-Spain-16" country="E" province="prov-Spain-2">
            <name>Granada</name>
            <latitude>37.18</latitude>
            <longitude>-3.6</longitude>
            <elevation>738</elevation>
            <population year="1991" measured="census">241471</population>
            <population year="1994">271180</population>
            <population year="2001" measured="census">240661</population>
            <population year="2011" measured="census">241003</population>
         </city>

我们的输入文件非常大,在这里复制起来有点困难。但这是西班牙一个省的一个非常小的样本。我们有一个适用于所有国家、省和市的 xml 文件。所以想象多种 xml 输入示例,但对于其他国家和城市。

基本上,我们计算每个国家/地区有多少个城市,然后返回数字,以及国家/地区的名称。但是我们得到了多行相同的行。

【问题讨论】:

  • 你能用不同的值检查这个返回语句吗:return (distinct-values(&lt;country name="{($co/name)}"&gt;{($count)}&lt;/country&gt;))
  • 它只返回数字,多个,而不是唯一的。
  • 请分享示例实际输入更改您的数据并保持您的标签正确,这将有助于我理解结构。
  • 您的建议返回,41 41 41 41 41 41 41 41 41 41 41 41 41 65 65 65 65 65
  • 请编辑您的问题并显示一个小而有代表性的 XML 输入示例。还请告诉我们您是使用 XQuery 1 还是 3,因为在 XQuery 3 中任何分组都更容易。

标签: python xml xpath xquery


【解决方案1】:

我认为,假设世界上每个国家/地区只有一个 country 元素,您只需消除一个 for 子表达式(无论如何您似乎都没有使用):

let $country := doc("file.xml")/mondial/country
for $co in $country
let $count := count($co/province/city)
where $count > 40
return <country name="{($co/name)}">{($count)}</country>

【讨论】:

    猜你喜欢
    • 2020-02-04
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多