XQuery:从jQuery AJAX帖子的序列创建嵌套的xml

时间:2013-09-20 23:35:57

标签: 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.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>

连连呢?思考?有什么要开始的吗?!

谢谢!

1 个答案:

答案 0 :(得分: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) )

typeswitch转换会删除MarkLogic JSON库用于指定对象类型的元素和属性。