【问题标题】:Changing the sub-element name in XQuery在 XQuery 中更改子元素名称
【发布时间】:2014-02-07 18:41:10
【问题描述】:

我对 XML 和 XQuery 还很陌生。 我拥有的 XML 数据如下所示:

我想得到的结果是:

 <country name="country-name">
      <big>city-name</big>
      <big>city-name</big>
    </country>

我的代码是:

for $a in doc("countries.xml")/countries/country[count(city[population > 7000000])>=1]
return 
<country> {$a/@name}
{let $b := $a/city[population>7000000]/name
return <big>{$b}</big>}
</country>

非常感谢任何提示我如何获得上述格式的结果。 谢谢

【问题讨论】:

  • 请不要将代码发布为屏幕截图,而是作为我们可以复制并用于测试我们放入答案的代码的文本......

标签: xml xpath xquery saxon kernow


【解决方案1】:

我猜你的问题是你想省略城市名称周围的&lt;name&gt; 标签。您可以通过在使用其值时添加/data() 来实现,例如。

<big>{$b/data()}</big>

另外,您不需要count 谓词中的元素。谓词是量化的存在;因此,如果至少有一个,则为真,否则为假。另一个问题是你没有循环城市。稍微清理一下代码的版本:

for $country in doc("countries.xml")/countries/country[city/population > 7000000]
return 
  <country>{
    $country/@name,
    for $city in $country/city[population > 7000000]
    return <big>{ $city/name/data() }</big>  
  }</country>

通过在轴步骤中使用计算元素构造函数(由较新的 XQuery 3.0 实现支持,我使用 BaseX 进行了测试),您可以将代码压缩到更少的行:

for $country in doc("countries.xml")/countries/country[city/population > 7000000]
return element country {
    $country/@name,
    $country/city[population > 7000000]/element big { ./name/data() }
  }

【讨论】:

  • @Janes Erat,感谢您的帮助,但仍然无法正常工作。它说系统功能数据#0 不适用于此宿主语言/版本。仅供参考,我使用的是 Kernow 1.8。
  • 在这种情况下,您可以改用text()
  • XQuery 1.0 和 3.0 允许在“/”之后使用 element{},并且应该在 Saxon 中也可以使用,但我建议不要这样做,因为从技术上讲,构造的“大”元素是不可预测的。 “/”将它们按文档顺序排序,一组无父元素节点的文档顺序未定义。你可能会侥幸逃脱,但它不是 100% 可靠的。 3.0“!”操作员会更安全。
  • 在 XQuery 1.0 中,data() 不可用,您必须改写 data(.)
  • 感谢/! 对文档顺序的见解!如果我没听错的话,排序发生在 执行轴步骤之后(因此在构造新的 &lt;big/&gt; 元素之后)?
猜你喜欢
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多