【问题标题】:XQuery return doesn't calculate anythingXQuery 返回不计算任何东西
【发布时间】:2018-07-18 16:39:25
【问题描述】:

所以,我们需要使用 XQuery 来做这个练习。用于存储在 XML 中的操作的计算器。这是我第一次使用 XQuery,我很困惑。无论我在 return 语句中放什么,Saxon 都不会返回包含在 return 段中的函数的结果,而只是以纯文本形式返回,所以调用:

declare function m:evaluate($tree as element()) as element(fraction) {
if(local-name($tree)="fraction") then (

 for $a in $tree
  return
     <fraction>
        <numerator>$tree/numerator</numerator>
        <denominator>$tree/denominator </denominator>
     </fraction>
)
else(

typeswitch($tree)
  case $tree as element(sum)
    return element fraction{
      <numerator>$tree/*[1]/numerator/$tree/*[1]/denominator*$ggT+$tree/*[2]/numerator/$tree/*[2]/denominator*$ggT)</numerator>,
      <denominator>m:findggT($tree/*[1]/denominator,$tree/*[2]/denominator)</denominator>}
  case $tree as element(product)
    return element fraction{
      <numerator>m:evaluate($tree/*[1]/numerator)*m:evaluate($tree/*[2]/numerator)</numerator>,
      <denominator>m:evaluate($tree/*[1]/denominator)*m:evaluate($tree/*[2]/denominator)</denominator>
    }
  default return element fraction  {
      <numerator>$tree/numerator</numerator>,
      <denominator>$tree/denominator </denominator>
  }


)

返回

<fraction>
   <numerator>m:evaluate($tree/*[1]/numerator)*m:evaluate($tree/*[2]/numerator)</numerator>
   <denominator>m:evaluate($tree/*[1]/denominator)*m:evaluate($tree/*[2]/denominator)</denominator>
</fraction>%     

很明显,被调用的xml的根元素是product

似乎我错过了有关 XQuery 中函数调用如何工作的一些内容,但我不知道是什么。

我使用的 XML 是:

<product>
  <sum>
    <fraction >
      <numerator >1</numerator >
      <denominator >2</denominator >
    </fraction >
    <fraction >
      <numerator >1</numerator >
      <denominator >3</denominator >
    </fraction >
    <fraction >
      <numerator >1</numerator >
      <denominator >4</denominator >
    </fraction >
  </sum>
  <fraction >
    <numerator >2</numerator >
    <denominator >3</denominator >
  </fraction >
</product >

【问题讨论】:

    标签: xml xquery saxon


    【解决方案1】:

    您的表达式被视为文本,因为它们不在大括号内 ({})。花括号已经是computed element constructor 语法的一部分,但在使用direct element constuctor 时需要添加它们以区分纯文本和表达式:

    <numerator>{ m:evaluate($tree/*[1]/numerator) * m:evaluate($tree/*[2]/numerator)}</numerator>
    

    【讨论】:

    • 谢谢。那行得通。我现在有很多其他问题。有没有调试 xquery 的好方法(例如,当我得到“不允许在...中使用空参数”并且我想知道会发生什么时)?
    • @MariusRom OxygenXML 是一个不错的文本编辑器,可以突出显示代码中的错误。但是,仅读取 Saxon 调试器返回的错误和行号并查看您的代码可能会更快:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多