如果第一个 XML 中不存在 XSLT 从第二个 XML 复制元素 [英] XSLT copy elements from second XML if not exist in the first XML

查看:21
本文介绍了如果第一个 XML 中不存在 XSLT 从第二个 XML 复制元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下 XML:

car.xml:

<car ref-id="parts.xml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <color>red</color>
  <tire>michelin</tire>
  <engines>
    <engine>
      <model>Z</model>
    </engine>
  </engines>
  <hifi>pioneer</hifi>
</car>

parts.xml:

<?xml version="1.0" encoding="UTF-8"?>
<parts xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <engines>
    <engine>
      <model>X</model>
    </engine>
    <engine>
      <model>Y</model>
    </engine>
  </engines>
  <tire>goodyear</tire>
  <color>black</color>
  <airbag>true</airbag>
</parts>

我想将parts.xml 与car.xml 合并,但只想从parts.xml 复制那些在car.xml 中不存在的节点(不管它们的值如何).

I'd like to merge parts.xml with car.xml, but want to copy only those nodes from parts.xml (regardless of their value) which doesn't exist in car.xml.

例如,我需要以下输出:

E.g, I'd need the following output:

<car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <color>red</color>
  <tire>michelin</tire>
  <engines>
    <engine>
      <model>Z</model>
    </engine>
  </engines>  
  <hifi>pioneer</hifi>
  <airbag>true</airbag>
</car>

我被困在以下合并所有元素的转换中:

I'm stuck at the following transformation which merges all the elements:

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" indent="yes" />

    <xsl:variable name="loc">
        <xsl:value-of select="car/@ref-id" />
    </xsl:variable>

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

    <xsl:template match="car">
        <xsl:copy>
            <xsl:apply-templates select="@*|node() | document($loc)/parts/*" />
        </xsl:copy>
    </xsl:template>

</xsl:transform>

推荐答案

这是一个相当尴尬的安排,而解决方案 - 至少在 XSLT 1.0 中 - 也同样尴尬:

That's a rather awkward arrangement to have, and the solution - at least in XSLT 1.0 - is no less awkward:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/car">
    <xsl:variable name="local-names">
        <xsl:for-each select="*">
            <name><xsl:value-of select="name()"/></name>
        </xsl:for-each>
    </xsl:variable>
    <xsl:copy>
        <xsl:copy-of select="*"/>
        <xsl:copy-of select="document(@ref-id)/parts/*[not(name()=exsl:node-set($local-names)/name)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

这篇关于如果第一个 XML 中不存在 XSLT 从第二个 XML 复制元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆