我希望有人可以指出我正确的方向。我试图以我能想到的简单形式来区分我的问题。在解析文件时:
<?xml version="1.0" encoding="UTF-8"?>
<Master>
<Info>
<Info1></Info1>
<Info2></Info2>
<Info3></Info3>
<Offer>
<Id>1a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
</Offer>
<Offer>
<Id>3a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
</Offer>
</Info>
</Master>
我需要将它与类似的文件进行比较:
<?xml version="1.0" encoding="UTF-8"?>
<Old>
<Info>
<Info1></Info1>
<Info2></Info2>
<Info3></Info3>
<Offer>
<Id>1a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
</Offer>
<Offer>
<Id>2a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
</Offer>
</Info>
</Old>
使用该字段作为键,我想用以下内容生成以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<Merged>
<Info> ##from Master
<Info1></Info1>
<Info2></Info2>
<Info3></Info3>
<Offer> ##from Master
<Id>1a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
<Action>Update</Action>
</Offer>
<Offer> ##from Old
<Id>2a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
<Action>Delete</Action>
</Offer>
<Offer> ##from Master
<Id>3a</Id>
<Field1></Field1>
<Field2></Field2>
<Field3></Field3>
<Action>Add</Action>
</Offer>
</Info>
</Merged>
1a在Master和Old中匹配,因此它变为更新操作,2a存在于Old但不存在Master中它变为删除操作而3a仅存在于Master中,因此它变为添加操作。和数据总是来自主人(当然在删除案例中除外)。
提前感谢您的帮助。
答案 0 :(得分:0)
这似乎相当简单(或者我误解了要求):
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="master" select="document(base-uri())" />
<xsl:variable name="old" select="document('old.xml')"/>
<xsl:key name="offer" match="Offer" use="Id" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Info">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:apply-templates select="$old/Old/Info/Offer[not(key('offer', Id, $master))]" mode="delete"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Offer">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Action>
<xsl:choose>
<xsl:when test="key('offer', Id, $old)">Update</xsl:when>
<xsl:otherwise>Add</xsl:otherwise>
</xsl:choose>
</Action>
</xsl:copy>
</xsl:template>
<xsl:template match="Offer" mode="delete">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Action>Delete</Action>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
这里假设Master.xml文件是正在处理的文件。