如果在第一个 XML 中设置了属性,则 XSLT 从第二个 XML 复制元素

XSLT copy elements from second XML if an attribute is set in the first 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 override="false">
    <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 复制那些节点(无论它们的值如何):

Michael-hor257k provided a 到 A,但我坚持执行 B。

然后 XSLT 看起来像这样:

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

<xsl:template match="/car">
    <xsl:variable name="local-names">
        <xsl:for-each select="*">
            <name>
                <xsl:value-of select="name()" />
            </name>
            <attr>
                <xsl:value-of select="@override" />
            </attr>
        </xsl:for-each>
    </xsl:variable>

    <xsl:copy>
        <xsl:copy-of select="*" />
        <xsl:copy-of
            select="document($loc)/parts/*[not(name()=exsl:node-set($local-names)/name)] or 
                exsl:node-set($local-names)/attr='false'"/> 
    </xsl:copy>
</xsl:template>

我尝试添加

<attr>
  <xsl:value-of select="@override" />
</attr>

or exsl:node-set($local-names)/attr='false' 到 XSLT 但没有成功。

变化:

        <attr>
            <xsl:value-of select="@override" />
        </attr>

收件人:

        <attr>
            <xsl:value-of select="engines/@override" />
        </attr>

您可以将第 10 行更改为:

<xsl:for-each select="*">

至:

<xsl:for-each select="*[not(@override='false')]">

您没有post预期的结果,所以我不确定它是否合您的口味。如果您需要合并不同级别的节点,这可能比看起来复杂得多。