gpt4 book ai didi

xml - 如何使用 XSLT 2.0 合并两个文档之间的元素?

转载 作者:行者123 更新时间:2023-12-05 05:23:06 24 4
gpt4 key购买 nike

我在一个XML文档中有如下默认配置项:

<ProgramConfig>

<Fragment xml:lang="en" name="TargetSector">fragment/target_sector.xdp</Fragment>
<Fragment xml:lang="fr" name="TargetSector">fragment/target_sector_fr.xdp</Fragment>


<MasterTemplate xml:lang="en">master/default_en.xdp</MasterTemplate>
<MasterTemplate xml:lang="fr">master/default_fr.xdp</MasterTemplate>

</ProgramConfig>

特定程序可以覆盖默认配置,例如:

<ProgramConfig>

<Fragment xml:lang="en" name="TargetSector">fragment/1-5ABQ/target_sector.xdp</Fragment>

<MasterTemplate xml:lang="fr">master/default_fr_1-5ABQ.xdp</MasterTemplate>

</ProgramConfig>

我需要合并 XML 文档,以便输出变为:

<ProgramConfig>

<Fragment xml:lang="en" name="TargetSector">fragment/1-5ABQ/target_sector.xdp</Fragment>
<Fragment xml:lang="fr" name="TargetSector">fragment/target_sector_fr.xdp</Fragment>


<MasterTemplate xml:lang="en">master/default_en.xdp</MasterTemplate>
<MasterTemplate xml:lang="fr">master/default_fr_1-5ABQ.xdp</MasterTemplate>

</ProgramConfig>

如果特定于程序的 XML 具有与默认 XML 具有相同名称和匹配属性的元素,那么它应该替换输出文档中的值。

XML 非常扁平 - 它始终是 ProgramConfig 根下的一组元素,没有其他子元素。每个元素定义 Assets 的文件系统路径。

有没有办法使用 XSLT 来做到这一点。我尝试使用文档功能,但我不确定如何匹配元素和所有属性。

最佳答案

使用 XSLT 3.0,您可以使用 for-each-group 和使用节点名称和所有属性的复合分组键来解决它:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="xs math"
version="3.0">

<xsl:output indent="yes"/>

<xsl:template name="xsl:initial-template">
<ProgramConfig>
<xsl:for-each-group select="doc('defaultConfig.xml')/ProgramConfig/*,
doc('overrideConfig.xml')/ProgramConfig/*"
group-by="node-name(.), sort(@*, function($a) { name($a) })" composite="yes">
<xsl:copy-of select="if (current-group()[2]) then current-group()[2] else current-group()[1]"/>
</xsl:for-each-group>
</ProgramConfig>
</xsl:template>

</xsl:stylesheet>

使用 XSLT 2.0,基于名称和所有属性值构造单个分组键有点困难:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:mf="http://example.com/mf"
exclude-result-prefixes="xs math mf"
version="2.0">

<xsl:output indent="yes"/>

<xsl:function name="mf:sort" as="node()*">
<xsl:param name="input-nodes" as="node()*"/>
<xsl:perform-sort select="$input-nodes">
<xsl:sort select="name()"/>
</xsl:perform-sort>
</xsl:function>

<xsl:template name="main">
<ProgramConfig>
<xsl:for-each-group select="doc('defaultConfig.xml')/ProgramConfig/*,
doc('overrideConfig.xml')/ProgramConfig/*"
group-by="string-join((string(node-name(.)), mf:sort(@*)), '|')">
<xsl:copy-of select="if (current-group()[2]) then current-group()[2] else current-group()[1]"/>
</xsl:for-each-group>
</ProgramConfig>
</xsl:template>

</xsl:stylesheet>

关于xml - 如何使用 XSLT 2.0 合并两个文档之间的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38829002/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com