【发布时间】:2015-12-30 02:13:10
【问题描述】:
我有两个 xml 文件。
文件 1 -
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<School>
<section id="12" name="Apple"/>
<section id="50" name="Newton"/>
</School>
<Students>
<roll no="111" name="Smith"/>
<roll no="122" name="Alan"/>
<roll no="20" name="Bruce"/>
</Students>
<Teachers>
<Math>
<emp id="55" name="Karen"/>
<emp id="2" name="David"/>
</Math>
<Science>
<emp id="1" name="Thomas"/>
</Science>
</Teachers>
<Sports>
<Indoor>
<Boardgame>
<game id="12" name="Chess"/>
</Boardgame>
<Arcade>
<game id="3" name="Car Racing"/>
</Arcade>
</Indoor>
<Outdoor>
<Field>
<game id="1" name="Football"/>
<game id="100" name="Cricket"/>
</Field>
<Court>
<game id="2" name="Tennis"/>
</Court>
</Outdoor>
</Sports>
</Root>
文件 2 -
<?xml version="1.0" encoding="UTF-8"?>
<Updates>
<School>
<section id="12" name="Orange"/>
</School>
<Students>
<roll no="122" name="Sam"/>
</Students>
<Teachers>
<Math>
<emp id="300" name="Steve" />
</Math>
</Teachers>
<Sports>
<Indoor>
<Boardgame>
<game id="37" name="Monopoly"/>
</Boardgame>
<Boardgame2>
<game id="36" name="Ludo"/>
</Boardgame2>
</Indoor>
<Outdoor>
<Field>
<game id="1" name="Football"/>
<game id="100" name="Bull Fighting"/>
</Field>
<Court>
<game id="19" name="Badminton"/>
</Court>
</Outdoor>
<Computer>
<game id="10" name="AOE" />
</Computer>
</Sports>
</Updates>
我需要合并文件以获得以下输出。如果 id/no 匹配,file2 中的条目将覆盖 file1 中的条目。新元素将根据需要从 file2 的输出中添加到适当层次结构下。
转换的输出 -
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<School>
<section id="12" name="Orange"/>
<section id="50" name="Newton"/>
</School>
<Students>
<roll no="111" name="Smith"/>
<roll no="122" name="Sam"/>
<roll no="20" name="Bruce"/>
</Students>
<Teachers>
<Math>
<emp id="55" name="Karen"/>
<emp id="2" name="David"/>
<emp id="300" name="Steve" />
</Math>
<Science>
<emp id="1" name="Thomas"/>
</Science>
</Teachers>
<Sports>
<Indoor>
<Boardgame>
<game id="12" name="Chess"/>
<game id="37" name="Monopoly"/>
</Boardgame>
<Arcade>
<game id="3" name="Car Racing"/>
</Arcade>
<Boardgame2>
<game id="36" name="Ludo"/>
</Boardgame2>
</Indoor>
<Outdoor>
<Field>
<game id="1" name="Football"/>
<game id="100" name="Bull Fighting"/>
</Field>
<Court>
<game id="2" name="Tennis"/>
<game id="19" name="Badminton"/>
</Court>
</Outdoor>
<Computer>
<game id="10" name="AOE" />
</Computer>
</Sports>
</Root>
下面是 XSLT,但它仅适用于更新,不适用于插入。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
<xsl:apply-templates select="node()">
<xsl:with-param name="doc-context" select="document('file2.xml')/node()" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node()">
<xsl:param name="doc-context" />
<xsl:variable name="id" select="@id" />
<xsl:variable name="no" select="@no" />
<xsl:copy>
<xsl:copy-of select="@*|$doc-context[@id = $id or @no = $no]/@*" />
<xsl:apply-templates select="node()">
<xsl:with-param name="doc-context" select="$doc-context/node()" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
到目前为止你有没有尝试过?如果您尝试解决您的问题,如果您发布尝试的代码,我们可以提供帮助,谢谢
-
包括了我迄今为止工作的 XSLT,它适用于基于 ids 或 nos 的更新。但它不处理插入或删除。
-
您可以使用 XSLT 2.0 吗? 3.0?
-
另外,订购重要吗?
-
更改文件如何表示删除?