如果在第一个 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 复制那些节点(无论它们的值如何):
- A,不存在于car.xml
- B,存在于汽车xml,但元素的
"override" 属性设置为 false。
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预期的结果,所以我不确定它是否合您的口味。如果您需要合并不同级别的节点,这可能比看起来复杂得多。
我有以下输入 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 复制那些节点(无论它们的值如何):
- A,不存在于car.xml
- B,存在于汽车xml,但元素的 "override" 属性设置为 false。
Michael-hor257k provided a
然后 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预期的结果,所以我不确定它是否合您的口味。如果您需要合并不同级别的节点,这可能比看起来复杂得多。