Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于从另一个XML更新XML的动态递归xslt_Xml_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

用于从另一个XML更新XML的动态递归xslt

用于从另一个XML更新XML的动态递归xslt,xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,背景/摘要: 我有一个非常大的嵌套(作业XML)XML。我们正在做一个允许用户更改数据(XML的可视化)的过程,然后我们需要将这些更改映射回XML,以便我们可以将XML中的更新推回到源系统。用户可以在他们看到的文档的任何级别更改1件或100万件事情 我们使用的允许用户进行更改的平台生成了一个标签列表及其值(更改列表),用户更改了这些标签和值。我们将这些标记映射到源XML位置,但在java transformer中这样做将非常庞大,维护起来也不有趣 理想情况下,我希望从第三方平台XML(Chang

背景/摘要: 我有一个非常大的嵌套(作业XML)XML。我们正在做一个允许用户更改数据(XML的可视化)的过程,然后我们需要将这些更改映射回XML,以便我们可以将XML中的更新推回到源系统。用户可以在他们看到的文档的任何级别更改1件或100万件事情

我们使用的允许用户进行更改的平台生成了一个标签列表及其值(更改列表),用户更改了这些标签和值。我们将这些标记映射到源XML位置,但在java transformer中这样做将非常庞大,维护起来也不有趣

理想情况下,我希望从第三方平台XML(Change XML)生成一个XML,该平台在原始XML中有要更新的位置,并有标识符来说明应该更改原始XML(Jobs XML)的哪一部分

问题: 给定Changes.xml和modifications,对于每个mod字段,如果Jobs.xml中的字段与修改中调用的标识符条件匹配,则用该mod的值替换该字段

我已经想到,我可以在给定XPath列表的情况下动态选择XPath,并动态更新该值。如果在选择上没有条件,但有条件的话,这是可行的

我可以使用XSL 1-3,这无关紧要


账户/位置区域/本LOC
/帐户/位置区域/此位置/作业/作业
薪水
1000
账户/位置区域/本LOC
钥匙
1.
帐户/位置区域/此位置/作业/作业
建筑
1.
帐户/位置区域/此位置/作业/作业
角色
厨房
账户/位置区域/本LOC
/账户/位置区域/本LOC
经理
山姆
/账户/位置区域/本LOC
更新
真的

地点1
院长
1.
1.
1.
文学士
100
2.
1.
信息技术
200
3.
1.
厨房
300
地点2
史密斯
假的
2.
1.
1.
厨房
300
2.
2.
邮寄
400

我希望结果如下所示:

  • (1) 仅位置键1厨房角色的“工资”已从300更新为1000
  • (2) 所有地点的“经理”均更改为“Sam”
  • (3)“更新”对于所有位置都设置为true,并且对于所有丢失标签的位置都添加了“更新”

地点1
山姆
真的
1.
1.
1.
文学士
100
2.
1.
信息技术
200
3.
1.
厨房
350
地点2
山姆
真的
2.
1.
1.
厨房
300
2.
2.
邮寄
400

老实说,作为相信XSLT非常通用的人,这看起来像是过程语言的工作。使用XSLT,您可以对输入文档(jobs.xml)中的每个节点进行过滤,因此您必须查看修改列表,并确定当前节点是否符合任何修改节点的所有条件。如果没有别的,它将是相当缓慢的

XSLT不能做的是就地更新。它总是从输入中生成新的输出,尽管它可以用于简单地将部分节点从输入复制到输出中。但是,打开源文档,然后迭代修改列表,搜索符合条件列表的一个或多个节点,操作值并添加/更新“updated”属性,似乎更“自然”

解释标准清单还需要相当多的智慧。例如,/changes/modifications/modification[1]/identifiers/identifier[1]和identifier[2]具有不同的路径,因此一个路径限定父元素,而另一个路径引用要修改的元素。所有这些都必须编码成某种逻辑,实际上