如何最好地将数据与xslt合并

时间:2014-08-27 17:34:38

标签: xml xslt merge xslt-2.0

我希望有人可以指出我正确的方向。我试图以我能想到的简单形式来区分我的问题。在解析文件时:

<?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中,因此它变为添加操作。和数据总是来自主人(当然在删除案例中除外)。

提前感谢您的帮助。

1 个答案:

答案 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文件是正在处理的文件。