gpt4 book ai didi

xml - 如何合并(覆盖)两个 xml 文档?

转载 作者:数据小太阳 更新时间:2023-10-29 03:02:32 24 4
gpt4 key购买 nike

假设我有一个像这样的 A 文档:

<document>
<element>
<value>1</value>
<wom>bat</wom>
</element>
<bar>
<baz />
<baz />
<baz />
</bar>
</document>

和这样的B文档:

<document>
<element>
<value>2</value>
</element>
<bar>

</bar>
</document>

结果是这样的:

<document>
<element>
<value>2</value>
<wom>bat</wom>
</element>
<bar>

</bar>
</document>

所以我想要实现的是用文档 B 但保持同级值不变。但是,如果 B 中的标签是空的(叶),我希望它在 A 中的对应标签也被清空。我检查过this问题,但它正在合并而不是覆盖。我该如何解决这个问题?

澄清:AB 文档具有相同的结构,但B 的元素较少。我必须清空 A 中的每个元素,而 B 中的每个元素都是空的,如果它不为空,我必须覆盖元素中的每个内部元素(参见我的示例)。

最佳答案

一种方法可能是在 DocumentA 上导航,但将参数集传递给 Document B 中的等效节点。

首先匹配A的文档节点,然后从B的文档节点开始匹配

   <xsl:template match="/">
<xsl:apply-templates>
<xsl:with-param name="parentB" select="document('DocB.xml')"/>
</xsl:apply-templates>
</xsl:template>

然后,您将有一个模板将(A 中的)任何元素与 B 中的当前(父)节点作为参数匹配

   <xsl:template match="*">
<xsl:param name="parentB"/>

要在 B 中找到等效的“子”节点,首先要找到 A 节点的当前位置(如果有多个同名子节点),然后检查父节点下是否存在这样的子节点B节点

<xsl:variable name="posA">
<xsl:number />
</xsl:variable>
<xsl:variable name="nodeB" select="$parentB/*[local-name() = local-name(current())][number($posA)]"/>

那么,就是判断复制A节点还是B节点的情况。要复制 B 节点,B 节点必须存在,并且没有任何子元素(但它可能有子文本节点,将被复制

<xsl:when test="$nodeB and not($nodeB/*)">
<xsl:copy-of select="$nodeB/node()"/>
</xsl:when>

否则继续处理A节点(传入当前B节点作为参数)。

试试这个 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
<xsl:apply-templates>
<xsl:with-param name="parentB" select="document('DocB.xml')"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="*">
<xsl:param name="parentB"/>
<xsl:variable name="posA">
<xsl:number />
</xsl:variable>
<xsl:variable name="nodeB" select="$parentB/*[local-name() = local-name(current())][number($posA)]"/>
<xsl:copy>
<xsl:choose>
<xsl:when test="$nodeB and not($nodeB/*)">
<xsl:copy-of select="$nodeB/node()"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()">
<xsl:with-param name="parentB" select="$nodeB"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>

<xsl:template match="@*|node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

关于xml - 如何合并(覆盖)两个 xml 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24084238/

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