我请求对以下问题提供一些帮助。我正在尝试创建一个XSLT,它将最终合并Main.xml和Main_2.xml之间的内容。这些都是人为的例子,但结构是正确的。其目标只是将来自Main.xml的任何'fff‘和'zzz’元素替换为'ggg‘元素,如果它们的“ccc”兄弟姐妹在Main.xml和Main_2.xml中都匹配的话,则其子元素来自Main_2.xml。Main.xml的其余部分必须保持不变。任何指针或引用都将受到赞赏。
Main.xml
<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
<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>期望输出
<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
<?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元素
发布于 2019-11-13 19:41:37
这样试试?
XSLT1.0
<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元素?
在这种情况下,我可能会放弃使用密钥,并做:
<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>https://stackoverflow.com/questions/58844062
复制相似问题