xml - 如何合并元素并将它们分组
问题描述
如何合并以下 XML 片段:
片段1:
<drug>
<title>Paracetamol</title>
<indications outputclass="indicationsAndDose">
<title>Indications and dose</title>
<body>
<section outputclass="indicationAndDoseGroup">
<sectiondiv outputclass="therapeuticIndications">
<p outputclass="therapeuticIndication">Some indication 1</p>
<p outputclass="therapeuticIndication">Some indication 2</p>
</sectiondiv>
</section>
</body>
</indications>
</drug>
片段 2:
<drug>
<title>Abacavir</title>
<indications outputclass="indicationsAndDose">
<title>Indications and dose</title>
<body>
<section outputclass="indicationAndDoseGroup">
<sectiondiv outputclass="therapeuticIndications">
<p outputclass="therapeuticIndication">Some indication 2</p>
</sectiondiv>
</section>
</body>
</indications>
</drug>
验收标准:
我需要输出一个 XML 片段,它是片段 1 和片段 2 的超集,但它需要基于元素、属性和值以不同的方式完成。
- 当元素相同且值不同且没有属性时,应合并它们,例如“扑热息痛”和“阿巴卡韦”
- 当元素具有相同的属性时,它们应该被合并值,例如“某些指示 1”
解决方案应该是动态的,因为上述规则可以应用于任何类型的元素,即
<title>
<section>
<p>
等<drug> <title>Paracetamol</title> <indications outputclass="indicationsAndDose"> <title>Indications and dose</title> <body> <section outputclass="indicationAndDoseGroup"> <sectiondiv outputclass="therapeuticIndications"> <p outputclass="therapeuticIndication">Some indication 1</p> <p outputclass="therapeuticIndication">Some indication 2</p> </sectiondiv> </section> </body> </indications> </drug>
解决方案
我不确定这是否是您想要的那种合并,因为您的要求非常模糊!但是,它会根据您提供的输入生成输出:
declare variable $local:xml1 := document {
<drug>
<title>Paracetamol</title>
<indications outputclass="indicationsAndDose">
<title>Indications and dose</title>
<body>
<section outputclass="indicationAndDoseGroup">
<sectiondiv outputclass="therapeuticIndications">
<p outputclass="therapeuticIndication">Some indication 1</p>
</sectiondiv>
</section>
</body>
</indications>
</drug>
};
declare variable $local:xml2 := document {
<drug>
<title>Abacavir</title>
<indications outputclass="indicationsAndDose">
<title>Indications and dose</title>
<body>
<section outputclass="indicationAndDoseGroup">
<sectiondiv outputclass="therapeuticIndications">
<p outputclass="therapeuticIndication">Some indication 2</p>
</sectiondiv>
</section>
</body>
</indications>
</drug>
};
declare function local:merge($i1, $i2) {
if (node-name($i1) eq node-name($i2)) then
(
(: When elements are the same and the value is different
and they have no attributes they should be merged
e.g. "Paracetamol" and "Abacavir"
:)
if (empty(($i1/@*, $i2/@*))) then
element {node-name($i1)} {
$i1/@*,
$i1/text(),
let $ii1 := $i1/node()[1]
let $ii2 := $i2/node()[1]
return
if (not(empty($ii1)) and not(empty($ii2))) then
local:merge($ii1, $ii2)
else()
}
(: When the elements have the same attribute then they
should be merged value e.g. "Some indication 1"
:)
else if (fn:deep-equal($i1/@*, $i2/@*)) then
(
element {node-name($i1)} {
$i1/@*,
$i1/text(),
let $ii1 := $i1/node()[1]
let $ii2 := $i2/node()[1]
return
if (not(empty($ii1)) and not(empty($ii2))) then
local:merge($ii1, $ii2)
else()
},
if (not(empty($i1/text())) and not(empty($i2/text()))) then
element {node-name($i2)} {
$i2/@*,
$i2/text()
}
else()
)
else (),
let $ii1 := $i1/following-sibling::node()[1]
let $ii2 := $i2/following-sibling::node()[1]
return
if (not(empty($ii1)) and not(empty($ii2))) then
local:merge($ii1, $ii2)
else()
)
else()
};
local:merge($local:xml1/drug, $local:xml2/drug)
推荐阅读
- javascript - 将数据“以编程方式”加载到 html 输入类型文件
- mongodb - 如何知道我所在的月份是否与某个日期重合
- android - 从工作表对话框中选择选项后选择图像时,Android Studio Kotlin webview 应用程序崩溃
- reactjs - 反应导航 5.x 中的自定义抽屉组件无法正常工作
- swift - 如何在 macOS 上使用 AppKit 使鼠标滚轮水平滚动
- amazon-s3 - Aws S3 Select ScanRange 未按预期工作并提供整个文件结果
- firebase - Flutter:未处理的异常:错误状态:该批次已提交,无法再更改
- python - 使用硒时如何防止出现异常
- angular - 相互依赖的 Angular 库辅助入口点
- javascript - 状态中传递的数据更多,未正确获取