首页 > 解决方案 > 为什么 XML 文件的值在 XQuery 中显示为属性?

问题描述

我对我为 uni proyect 编写的 XQuery 代码有疑问。代码如下:

<results>
{
   for $item in doc("data.xml")//item
   return
      <country alpha-2="{$item/city/country}"> 
         <name> {doc("countries.xml")//country[@alpha-2=$item/city/country]/@name} </name>
         <cities>
            <city>
               <name> {$item/city/@name} </name>
               <temp unit="{$item/temperature/@unit}"> {$item/temperature/@value} </temp>
               <feels_like unit="{$item/feels_like/@unit}"> {$item/feels_like/@value} </feels_like>
               <humidity unit="{$item/humidity/@unit}"> {$item/humidity/@value} </humidity>
               <pressure unit="{$item/pressure/@unit}"> {$item/pressure/@value} </pressure>
               <clouds> {$item/clouds/@name} </clouds>
            </city>
         </cities>
      </country>
}
</results>

这看起来很简单,但是当我编译它时,新节点的值显示为属性,如下面的代码所示:

<?xml version="1.0" encoding="UTF-8"?>
<results>
   <country alpha-2="LV">
      <name name="Latvia"/>
      <cities>
         <city>
            <name name="Zilupe"/>
            <temp unit="kelvin" value="281.15"/>
            <feels_like unit="kelvin" value="277.59"/>
            <humidity unit="%" value="86"/>
            <pressure unit="hPa" value="1023"/>
            <clouds name="overcast clouds"/>
         </city>
      </cities>
   </country>
   <country alpha-2="RU">
      <name name="Russian Federation"/>
      <cities>
         <city>
            <name name="Sebezh"/>
            <temp unit="kelvin" value="280.82"/>
            <feels_like unit="kelvin" value="277.37"/>
            <humidity unit="%" value="90"/>
            <pressure unit="hPa" value="1023"/>
            <clouds name="overcast clouds"/>
         </city>
      </cities>
   </country>
</results>

有谁知道为什么会这样?我可能错过了一些明显的东西,但我看不到它。

标签: xmlxquery

解决方案


由于您在 xpath 中提取了一个属性,所以这就是您在元素中放置的内容。您需要用 xs:string() 包围 xpath

<name> {doc("countries.xml")//country[@alpha-2=$item/city/country]/@name} </name>

应该

<name> {xs:string(doc("countries.xml")//country[@alpha-2=$item/city/country]/@name)} </name>

推荐阅读