我正在网页上的某些表单上使用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>
连连呢?思考?有什么要开始的吗?!
谢谢!
答案 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库用于指定对象类型的元素和属性。