1

我要编写一个非常复杂的 XQuery(至少按照我的标准)。

这是我的输入xml:

<testRequest>
    <request1>
       <Line>1</Line>
       <action>addtoName</action>
    </request1>
    <request2>
        <Line>2</Line>
        <action>addtoSpace</action>
    </request2>
    <request3>
         <Line>3<Line>
         <action>addtospace</action>
    </request3>
</testRequest>

在我的输出 xml 中,操作应作为属性附加到“request1”元素。因此,根据 request1 元素下的 action 元素,request1 元素的属性应该是以下之一:

if action = IgnoreCase(addtoName), the request1 element should be <request1 action=insertingname>
if action =  IgnoreCase(addtoSpace), the request1 element should be <request1 action=updatingspace>

不仅如此,我还需要根据元素下面的操作值向元素添加一个属性。所以,我要遍历一个元素下的每一个元素,看看有没有一个元素等于“addtospace”,如果是,那么我需要获取元素的对应值,并为元素组成属性。从上面的 xml 中,我的元素属性应该是,

<testRequest lineFiller="Line Like 2_* AND Line Like 3_*>, where 2 and 3 are the respective line numbers.

如果没有 element=addtoSpace 的元素,则该元素的属性应“更改”。

因此,总而言之,我转换后的 xml 应如下所示:

<testRequest lineFiller="Line Like 2_* AND Line Like 3_*>
    <request1 action=insertingname>
       <Line>1</Line>
       <action>addtoName</action>
    </request1>
    <request2 action=updatingspace>
        <Line>2</Line>
        <action>addtoSpace</action>
    </request2>
    <request3 action=updatingspace>
         <Line>3<Line>
         <action>addtospace</action>
    </request3>
</testRequest>

任何帮助完成这项艰巨的任务将不胜感激。

谢谢!!!

4

1 回答 1

1

您应该定义函数来生成需要添加到元素的属性。

为了添加到“请求”元素,这应该有效:

declare function local:getaction($x) {
  if (lower-case($x/action) = "addtoname") then attribute action {"insertingspace"} else
  if (lower-case($x/action) = "addtospace") then attribute action {"updatingspace"} else
  ()
};

linefiller 属性可以类似地创建:

declare function local:getfiller($x) {
  attribute lineFiller {
      if ($x/*[lower-case(action) = "addtospace"]) then
          string-join(
          for $r in $x/*[lower-case(action) = "addtospace"]
            return concat("Line Like ",$r/Line,"_*")
          , " AND ")
      else "change"
      }
};

然后把它们放在一起,在你的原始文档上进行一个简单的 for 循环,在需要的地方添加属性:

let $doc:=<<your original document>>

return
<testRequest>
{ local:getfiller($doc) }
{ for $r in $doc/* return 
   element { name($r) } { 
    local:getaction($r),
    $r/* 
   }
}
</testRequest>

编辑:如果没有操作,增强的 getfiller 函数返回“更改”

于 2013-03-21T16:38:36.913 回答