XQuery:从jQueryAjaxPost中的序列创建嵌套xml

XQuery:从jQueryAjaxPost中的序列创建嵌套xml,jquery,xml,ajax,nested,xquery,Jquery,Xml,Ajax,Nested,Xquery,我正在使用jQuery序列化网页上某些表单上的数组。该数据将被发回XQuery页面。当我这样做时: xdmp:get-request-field('data') 我有一系列的事情,比如 data[0][name] data[0][value] data[1][name] data[1][value] 等 它们应该包含如下值: data[0][name] = person.name.first data[0][value] = Fred data[1][name] = person.name.

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

xdmp:get-request-field('data')
我有一系列的事情,比如

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

它们应该包含如下值:

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

就我的一生而言,我无法找到一种动态的方法来循环所有这些名称/值对,并将它们转换为可用的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>
建议?思想?有什么要开始的吗


谢谢

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

看起来这些请求参数是从JSON生成的。由于您在问题中使用的是MarkLogic note xdmp:get请求字段,因此可以发送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) )
typeswitch转换去掉MarkLogic JSON库用于指定对象类型的元素和属性