xquery - 如何使用其他XML中的值替换XML元素的值

时间:2017-05-15 06:52:53

标签: xml xquery

我正在尝试集成两个系统。 源系统使用值“标准”,而目标系统接受“标准”。 因此,我需要从源系统修改XML有效负载,以便进行这些类型的转换。

例如XML:

<Response>
 <Object>
  <ID>Test</ID>
  <Child>
   <Element1>Standard</Element1>
   <Element2>Some Value</Element2>
  </Child>
  <Child>
   <Element1>Extended</Element1>
   <Element2>Some Value</Element2>
  </Child>
  <Child>
   <Element1>Standard</Element1>
   <Element2>Some Value</Element2>
  </Child>
 </Object>
</Response>

输出应为:

<Response>
 <Object>
  <ID>Test</ID>
  <Child>
   <Element1>STD</Element1>
   <Element2>Some Value</Element2>
  </Child>
  <Child>
   <Element1>EXT</Element1>
   <Element2>Some Value</Element2>
  </Child>
  <Child>
   <Element1>STD</Element1>
   <Element2>Some Value</Element2>
  </Child1>
 </Object>
</Response>

寻找一个xQuery脚本来翻译上面的XML。 感谢任何帮助。

包含翻译代码的示例XML: 带目标值的XML如下所示:

<Root>
    <KeyCode>
        <Key>
            <SourceKey>Standard</SourceKey>
            <DestKey>STD</DestKey>
        </Key>
        <Key>
            <SourceKey>Extended</SourceKey>
            <DestKey>EXT</DestKey>
        </Key>
        <Key>
            <SourceKey>Privileged</SourceKey>
            <DestKey>PRV</DestKey>
        </Key>
    </KeyCode>
</Root>

使用以下代码:

let $keys := doc("key.xml")/Root/KeyCode

let $response := doc("test.xml")/Response

for $child in $response/Object/Child
return
<Response>
    <Object>
        {$response/Object/ID}
        <Child>
            {$keys/Key[SourceKey=$child/Element1]/DestKey}
            {$child/Element2}
        </Child>
    </Object>
</Response>

获得:

<Response>
  <Object>
    <ID>Test</ID>
    <Child>
      <DestKey>STD</DestKey>
      <Element2>Some Value</Element2>
    </Child>
  </Object>
</Response>
<Response>
  <Object>
    <ID>Test</ID>
    <Child>
      <DestKey>EXT</DestKey>
      <Element2>Some Value</Element2>
    </Child>
  </Object>
</Response>
<Response>
  <Object>
    <ID>Test</ID>
    <Child>
      <DestKey>STD</DestKey>
      <Element2>Some Value</Element2>
    </Child>
  </Object>
</Response>

我正在寻找

<Response>
  <Object>
    <ID>Test</ID>
    <Child>
      <DestKey>STD</DestKey>
      <Element2>Some Value</Element2>
    </Child>
    <Child>
      <DestKey>EXT</DestKey>
      <Element2>Some Value</Element2>
    </Child>
    <Child>
      <DestKey>STD</DestKey>
      <Element2>Some Value</Element2>
    </Child>
  </Object>
</Response>

请帮助告知错误的地方

1 个答案:

答案 0 :(得分:0)

我认为嵌套不太正确。 ResponseObject构造函数需要在FLWOR表达式之外,如下所示:

let $keys := doc("key.xml")/Root/KeyCode
let $response := doc("test.xml")/Response
return
<Response>
  <Object>
    {
      $response/Object/ID,
      for $child in $response/Object/Child
      return
        <Child>
          {
            $keys/Key[SourceKey=$child/Element1]/DestKey,
            $child/Element2
          }
        </Child>
    }
  </Object>
</Response>