1

我正在使用 jQuery 在网页上的某些表单上序列化数组。该数据被回发到 XQuery 页面。当我做:

xdmp:get-request-field('data')

我得到了一系列的东西,比如

data[0][name]
data[0][value]
data[1][name]
data[1][value]

ETC

这些应该具有如下所示的值:

data[0][name] = person.name.first
data[0][value] = Fred
data[1][name] = person.name.last
data[1][value] = Jones
data[2][name] = person.books-read.book[0].name
data[2][value] = Moby Dick
data[3][name] = person.books-read.book[0].page-count
data[3][value = 522
data[4][name] = person.books-read.book[0].name
data[4][value] = Bleak House
data[5][name] = person.books-read.book[0].page-count
data[5][value = 757

ETC

在我的一生中,我无法找到一种动态的方式来遍历所有这些名称/值对并将它们转换为可用的 xml 结构。

理想情况下,我会喜欢这样的东西:

<person>
    <name>
        <first>Fred</first>
        <last>Jones</last>
    </name>
    <books-read>
        <book>
            <name>Moby Dick</name>
            <page-count>522</page-count>
        </book>
        <book>
            <name>Bleak House</name>
            <page-count>757</page-count>
        </book>
    </books-read>
</person>

建议?想法?有什么要开始的吗?!

谢谢!

4

1 回答 1

0

您可以使用类似地图的结构来更新现有的 XML,但这种方法不太适合添加给定文档中尚不存在的元素或创建新文档。

看起来这些请求参数是从 JSON 生成的。由于您使用的是 MarkLogic(请注意xdmp:get-request-field()您的问题),您可以发送 JSON 而不是序列化表单,并使用 MarkLogic 库生成 XML:

xquery version "1.0";
import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy";
declare namespace jsonb = "http://marklogic.com/xdmp/json/basic";

declare variable $input :=
'{ "person": { "name": { "first": "Fred",
                         "last": "Jones" },
               "books-read": [
                 { "book": { "name": "Moby Dick",
                             "page-count": 522 } },
                 { "book": { "name": "Bleak House",
                             "page-count": 757 } }] } }';

declare function local:walk-tree($x)
{
  for $y in $x/node()
  return local:transform($y)
};

declare function local:transform($x)
{
  typeswitch($x)
    case element(jsonb:json) return
      local:walk-tree($x)
    case element() return
      element { fn:local-name($x) } {
        $x/@* except $x/@type,
        local:walk-tree($x)
      }
    default return $x
};

local:transform( json:transform-from-json($input) )

类型切换转换去除了 MarkLogic JSON 库用来指定对象类型的元素和属性。

于 2013-12-13T22:07:32.050 回答