- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
假设我有这样一个文档:
<root>
<content>
<z>valZ</z>
<a>
<b>
<c>valC</c>
</b>
<b>
<c>valC</c>
</b>
</a>
<a>
<d>valD</d>
</a>
</content>
</root>
节点“a”的数量可以从 1 到某个不超过 30 的未定义数字“b”、“c”和“d”节点的数量也可以从 0 到某个不超过 20 的未定义数字
我需要在 XQuery 中做的是获取节点“z”的值并将其复制到每个现有节点“b”,因此结构每次都将如下所示:
<root>
<content>
<z>valZ</z>
<a>
<b>
<c>valC</c>
<z>valZ</z>
</b>
<b>
<c>valC</c>
<z>valZ</z>
</b>
</a>
<a>
<d>valD</d>
<b> <!-- <b> was not present here before -->
<z>valZ</z>
</b>
</a>
</content>
</root>
如果只有一个 block “b”,我不需要创建另一个 block ,只需将“z”放入其中(如果存在多个“b”,则放入多个“b”内部)否则在每个“a”中"我需要创建一个新的。
看起来很简单?在 XQuery 以外的任何其他语言中,我都同意 - 您只需获取文档,复制“z”的值,遍历整个文档以查找每个“a”,检查这些找到的“a”是否有“b”,如果没有则创建“b”并在“b”中创建具有复制值的新“z”。
但我很难迭代同一文档并使用 inmemupdate.xq 库更新它。这是我使用的代码片段:
declare function changeSourceForFieldZ($rootDoc as document-node()) as document-node()? {
let $value := getValueOfFieldZ($rootDoc)
return populateBLevelIfValueExists($rootDoc, $value)
};
declare %private function getValueOfFieldZ($rootDoc as document-node()) as text()? {
$rootDoc/*:root/*:content/*:z/text()
};
declare %private function populateBLevelIfValueExists($rootDoc as document-node(), $value as text()?) as document-node()? {
if(fn:exists($value)) then
addField($enrichment, $value)
else
$rootDoc
};
declare %private function addField($rootDoc as document-node(), $value as text()) as document-node()? {
if (hasBLevel($rootDoc)) then
insertNodeInBLevel($rootDoc, $value)
else if (hasALevel($rootDoc)) then
insertNodeInALevel($rootDoc, $value)
else ()
};
declare %private function hasBLevel($rootDoc as document-node()) as xs:boolean {
fn:exists($rootDoc/*:root/*:content/*:a/*:b)
};
declare %private function hasALevel($rootDoc as document-node()) as xs:boolean {
fn:exists($rootDoc/*:root/*:content/*:a)
};
declare %private function createTagWithZField($value as text()) {
<z>{$value}</z>
};
declare %private function createWholeBtagBlock($value as text()) {
(
<b>
<z>{$value}</z>
</b>
)
};
问题显然是插入方法。如前所述,我使用 mem 库,更准确地说是一个函数:
declare function mem:node-insert-child(
$parentNode as element(),
$newNode as node()*
) as node()
如果我这样写 insertNodeInBLevel 和 insertNodeInALevel:
declare %private function insertNodeInBLevel($rootDoc as document-node(), $value as text()) {
mem:node-insert-child($rootDoc/*:root/*:content/*:a/*:b, createTagWithZField($value))
};
declare %private function insertNodeInALevel($rootDoc as document-node(), $value as text()) {
mem:node-insert-child($rootDoc/*:root/*:content/*:a, createWholeBtagBlock($value))
};
它返回了 rootDoc 文档的多个副本,其中值添加到不同的地方,而不是一个文档的所有位置都添加了节点。
我尝试了很多解决方案,包括递归和循环:
declare %private function insertNodeInBLevel($rootDoc as document-node(), $value as text()) {
if(fn:exists($rootDoc/*:root/*:content/*:a/*:b)) then
let $nodes := $rootDoc/*:root/*:content/*:a/*:b
for $node at $index in $nodes
let $rootDoc := exampleInsertWithIndex($rootDoc, $value, $index)
return $rootDoc
};
declare %private function exampleInsertWithIndex($rootDoc as document-node(), $value as text(), $index) {
mem:node-insert-child($rootDoc/*:root/*:content/*:a/*:b[$index], createTagWithZField($value))
};
但是,好吧,值是不可变的,所以不能第二次保存到同一个 rootDoc 等等......知道如何解决这个问题,所以我将编辑同一文档的多个节点并只返回这个,不是它的副本?我是面向对象语言的开发人员,函数式语言对我来说很新,它们遵循不同的范式,因此我对解决方案的思考方式可能有缺陷......
最佳答案
这可以通过 typeswitch 来完成以及这些元素的一些自定义逻辑
declare function local:transform($nodes as node()*) as item()* {
for $node in $nodes
return
typeswitch($node)
case text() return $node
case comment() return $node
case processing-instruction() return $node
case attribute() return $node
case element(a) return local:transform-a($node)
case element(b) return local:transform-b($node)
default return local:identity($node)
};
declare function local:transform-a($a as element(a)) as element(a) {
element a {
local:transform($a/(@* | node())),
if(not(exists($a/b))) then
element b { root($a[1])/content/z }
else ()
}
};
declare function local:transform-b($b as element(b)) as element(b) {
element b {
local:transform($b/(@* | node())),
if(not(exists($b/z))) then
root($b[1])/content/z
else ()
}
};
declare function local:identity($node as element()*) as item()* {
element {name($node)} {($node/@*, local:transform($node/node()))}
};
关于xml - 在内存中的 XQuery 中多次编辑同一个文档节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34592166/
我是 XQuery 初学者。我需要任何软件来运行 XQuery 吗?我在哪里输入 XQuery 代码 - 在 HTML 页面或 XML 中?我应该使用什么扩展名来保存我的 XQuery 文件? 最佳答
我正在编写一个 XQuery,它需要检查正在运行的 XQuery 版本(eXist、Saxon 等)。是否有一个标准函数可以返回 XQuery 的系统属性,例如版本、供应商等? 我知道有一些系统特定的
我正在阅读 book about xQuery它充满了像元素构造函数这样的表达......我的问题是: 什么是元素构造函数,“{}”是元素构造函数吗? 最佳答案 元素构造函数创建一个元素。在 XQue
我在网站上阅读了大量的 XQuery 教程。几乎他们所有人都在教我 XQuery 语法。假设我已经了解了 XQuery 语法,那么我将如何在我的网站上实际实现 XQuery? 例如,我有book.xm
以下有什么区别: import module namespace fs = "http://expath.org/ns/file"; declare namespace an = "http://zo
我有note.xml: Tove Jani Reminder Don't forget me this weekend! 和note.xqy: let $srcDoc:="not
我正在寻找一个示例,它表明 XQuery 表达式评估不是顺序的。在将 XQuery 的功能特性与过程语言进行比较时,总是会提到这一点。 例如在 XQuery, 2nd edition ,在下面的部分:
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。如需帮助澄清这个问题以便重新打开它,visit the help center .
所以我有一个看起来像这样的 XQuery: for $i in /*:rootElement where $i/*:field = "test" return $i 这个查询返回了很多结果,但我真的只
我有一个xml文档如下 sony vijay 我正在尝试写一个 xquery 1) 找到具有给定用户 ID 的用户 - sony 2) 将给定用户的“test”属性值更改为
是否XQuery更新支持自增属性,就像SQL中的自增字段一样? 我正在使用 BaseX作为我的数据库。 最佳答案 给定 an answer from Christian Grün on the Bas
是否可以使用 XQUERY 来检索属性 filename从以下 XML?我正在尝试使用 /preFileDoc/inpXML/@filename但它不起作用...... ABC XYZ
尝试根据不同的过滤器计算一个集合中的汽车数量。即使我们看到多辆汽车满足要求,查询也返回计数 0。 fn:count(cts:search(fn:collection("com.cars"), cts:
我想在 xquery 中创建一个计数器。我最初的尝试如下所示: let $count := 0 for $prod in $collection let $count := $count + 1 re
我有一系列的值。他们都可以是平等的……或者不是。所以使用 XQuery 我想获得序列中最频繁的项目。 let $counter := 0, $index1 := 0 for $value in $se
当我查找 XQuery 示例时,有时会看到使用了运算符 =>。 我试图寻找它的含义,但找不到任何东西。由于我使用的是 MarkLogic,因此它可能仅适用于 MarkLogic,但我对此表示怀疑。 从
我必须使用 xquery 以 DDMMYYYY 格式创建日期字符串。输入到我的 xquery 的日期将类似于“2004-05-02T00:00:00+01:00”。截至目前,我正在使用以下解决方案来获
我正在使用 XQuery 执行加法。以下是数据库中保存的XML结构: 1 1001 50,1
忙于将 SQLServer 2008 R2 和 MarkLogic 8 与简单的个人实体进行比较。我的数据集适用于 100 万条记录/文档。注意:两个数据库都在同一台机器上(本地主机)。 以下 SQL
想象一下,如果我有一个以下格式存储在 Marklogic 中的 xml 文档: DocumentID question1
我是一名优秀的程序员,十分优秀!