首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据两个XML文档之间的同级节点文本匹配创建一个XSLT来合并这两个XML文档?

如何根据两个XML文档之间的同级节点文本匹配创建一个XSLT来合并这两个XML文档?
EN

Stack Overflow用户
提问于 2019-11-13 19:16:11
回答 1查看 28关注 0票数 0

我请求对以下问题提供一些帮助。我正在尝试创建一个XSLT,它将最终合并Main.xml和Main_2.xml之间的内容。这些都是人为的例子,但结构是正确的。其目标只是将来自Main.xml的任何'fff‘和'zzz’元素替换为'ggg‘元素,如果它们的“ccc”兄弟姐妹在Main.xml和Main_2.xml中都匹配的话,则其子元素来自Main_2.xml。Main.xml的其余部分必须保持不变。任何指针或引用都将受到赞赏。

Main.xml

代码语言:javascript
复制
<aaa>
    <bbb>
        <ccc>1234</ccc>
        <ddd>apple</ddd>
        <eeee>oranges</eeee>
        <fff>bananas</fff>
    </bbb>
    <bbb>
        <ccc>9876</ccc>
        <ddd>pears</ddd>
        <eeee>watermelon</eeee>
        <zzz>grapes</zzz>
    </bbb>
</aaa>

Main_2.xml

代码语言:javascript
复制
<aaa>
    <bbb>
        <ccc>1234</ccc>
        <ddd>apple</ddd>
        <eeee>oranges</eeee>
        <ggg>
            <hhh>asdf</hhh>
            <iii>
                <jjj>blue</jjj>
                <kkk>red</kkk>
                <lll>green</lll>
            </iii>
        </ggg>
    </bbb>
    <bbb>
        <ccc>9876</ccc>
        <ddd>pears</ddd>
        <eeee>watermelon</eeee>
        <ggg>
            <hhh>fdsa</hhh>
            <iii>
                <jjj>purple</jjj>
                <kkk>yellow</kkk>
                <lll>white</lll>
            </iii>
        </ggg>
    </bbb>
    <bbb>
        <ccc>45678</ccc>
        <ddd>veggies</ddd>
        <eeee>carrots</eeee>
        <ggg>
            <hhh>zxcf</hhh>
            <iii>
                <jjj>cyan</jjj>
                <kkk>black</kkk>
            </iii>
        </ggg>
    </bbb>
</aaa>

期望输出

代码语言:javascript
复制
<aaa>
    <bbb>
        <ccc>1234</ccc>
        <ddd>apple</ddd>
        <eeee>oranges</eeee>
        <ggg>
            <hhh>asdf</hhh>
            <iii>
                <jjj>blue</jjj>
                <kkk>red</kkk>
                <lll>green</lll>
            </iii>
        </ggg>
    </bbb>
    <bbb>
        <ccc>9876</ccc>
        <ddd>pears</ddd>
        <eeee>watermelon</eeee>
        <ggg>
            <hhh>fdsa</hhh>
            <iii>
                <jjj>purple</jjj>
                <kkk>yellow</kkk>
                <lll>white</lll>
            </iii>
        </ggg>
    </bbb>
</aaa>

当前XSLT

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <xsl:output method="xml" indent="yes" version="1.0" encoding="utf-8" />

    <xsl:variable name="tempMain" select="document('Main_2.xml')"/>

<!-- attempt at using key, didn't pan out
    <xsl:key name="fruits" match="bbb" use="ccc"/>
-->

    <!-- General copy -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>


    <!-- Replace these fields with new ones -->
    <xsl:template match="fff | zzz">
        <xsl:copy-of select="$tempMain/aaa/bbb[ccc = current()../ccc]/ggg"/>

    </xsl:template>  -->

</xsl:stylesheet>

作为一个不完全相关的附带问题,在创建XSLT时,您会推荐哪些资源?我已经完成了关于w3schools的教程,这并不是最棒的。我觉得我只是在抄袭不同问题的零碎内容,看看什么是有效的,但更愿意提高我的知识。

编辑 michael.hor257k的答案有效,我只需要修改它,这样如果Main_2.xml中找不到Main_2.xml文本,它就不会删除fff或zzz元素

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-13 19:41:37

这样试试?

XSLT1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.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:param name="path-to-lookup"> Main_2.xml</xsl:param>
<xsl:key name="fruits" match="bbb" use="ccc"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="fff | zzz">
    <xsl:variable name="key" select="../ccc"/>
    <!-- switch context to use key -->
    <xsl:for-each select="document($path-to-lookup)">
        <xsl:apply-templates select="key('fruits', $key)/ggg"/>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

添加:

--如果Main.xml中的ccc中的文本与Main_2.xml中的ccc元素不匹配,我如何修改它以不删除fff或zzz元素?

在这种情况下,我可能会放弃使用密钥,并做:

代码语言:javascript
复制
<xsl:template match="fff | zzz">
    <xsl:variable name="lookup" select="document($path-to-lookup)/aaa/bbb[ccc=current()/../ccc]"/>
    <xsl:choose>
        <xsl:when test="$lookup">
            <xsl:copy-of select="$lookup/ggg"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy-of select="."/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58844062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档