XQuery 从 XML 文件中删除所有具有属性 onlyChannels="print" 的元素
XQuery to remove all elements with attribute onlyChannels="print" from XML file
正在尝试使用 XQuery 从 XML 中删除属性为 onlyChannels="print"
的所有元素
onlyChannels="print"
的元素可以在任何地方和不同的层次。
输入XML
<?xml version="1.0" encoding="UTF-8"?>
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
<p onlyChannels="print">Abstract</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p onlyChannels="print">full</p>
<p>900 000 ha along the test of north‐east</p>
<doc>
<p onlyChannels="print"> do not print</p>
<p> print </p>
</doc>
</full>
</abstractGroup>
预期输出XML
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p>900 000 ha along the test of north‐east</p>
<doc>
<p> print </p>
</doc>
</full>
</abstractGroup>
我正在尝试这个 XQuery,但它只删除了第一级中的元素并且没有 XML 标记。
let $root:= abstractGroup/*/*[not(self::*/@onlyChannels="print")]
return $root
我得到了什么:
Abstract
900 000 ha along the test of north
Resumen
La orsdft de los trópifdaa
900 000 ha along the test of north‐east
do not print
print
如何打印 xml 标签并删除所有具有属性 onlyChannels="print" 的元素
你可以运行它通过recursive typeswitch function来转换XML:
declare function local:filter($nodes as node()*) as node()*
{
for $n in $nodes return
typeswitch ($n)
case element () return
if ($n[@onlyChannels="print"])
then local:filter($n/node())
else element { node-name($n) } { $n/@*, local:filter($n/node())}
default return $n
};
let $doc :=
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
<p onlyChannels="print">Abstract</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p onlyChannels="print">full</p>
<p>900 000 ha along the test of north‐east</p>
<doc>
<p onlyChannels="print"> do not print</p>
<p> print </p>
</doc>
</full>
</abstractGroup>
return local:filter($doc)
正在尝试使用 XQuery 从 XML 中删除属性为 onlyChannels="print"
的所有元素
onlyChannels="print"
的元素可以在任何地方和不同的层次。
输入XML
<?xml version="1.0" encoding="UTF-8"?>
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
<p onlyChannels="print">Abstract</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p onlyChannels="print">full</p>
<p>900 000 ha along the test of north‐east</p>
<doc>
<p onlyChannels="print"> do not print</p>
<p> print </p>
</doc>
</full>
</abstractGroup>
预期输出XML
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p>900 000 ha along the test of north‐east</p>
<doc>
<p> print </p>
</doc>
</full>
</abstractGroup>
我正在尝试这个 XQuery,但它只删除了第一级中的元素并且没有 XML 标记。
let $root:= abstractGroup/*/*[not(self::*/@onlyChannels="print")]
return $root
我得到了什么:
Abstract 900 000 ha along the test of north Resumen La orsdft de los trópifdaa 900 000 ha along the test of north‐east do not print print
如何打印 xml 标签并删除所有具有属性 onlyChannels="print" 的元素
你可以运行它通过recursive typeswitch function来转换XML:
declare function local:filter($nodes as node()*) as node()*
{
for $n in $nodes return
typeswitch ($n)
case element () return
if ($n[@onlyChannels="print"])
then local:filter($n/node())
else element { node-name($n) } { $n/@*, local:filter($n/node())}
default return $n
};
let $doc :=
<abstractGroup>
<abstract type="main" xml:lang="en">
<title type="main">Abstract</title>
<p>900 000 ha along the test of north</p>
<p onlyChannels="print">Abstract</p>
</abstract>
<abstract onlyChannels="online" type="main" xml:lang="es">
<title type="main">Resumen</title>
<p>La orsdft de los trópifdaa</p>
</abstract>
<full type="main" xml:lang="en">
<p onlyChannels="print">full</p>
<p>900 000 ha along the test of north‐east</p>
<doc>
<p onlyChannels="print"> do not print</p>
<p> print </p>
</doc>
</full>
</abstractGroup>
return local:filter($doc)