我想知道是否可以从另一个文件中获取相同资源(相同属性值)的值,在第一个文件中保留所有结构和注释。
也许我会用一个例子来解释它。
输入文件1(需要值的那个):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element name="1">File1-value1</frag>
<element name="2">File1-value2</frag>
<element name="3">File1-value3</frag>
</root>
输入文件2(从中获取值的那个):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element name="3">File2-value3</frag>
<element name="7">File2-value3</frag>
<element name="1">File2-value1</frag>
<element name="2">File2-value2</frag>
</root>
期望的输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<element name="1">File2-value1</frag>
<element name="2">File2-value2</frag>
<element name="3">File2-value3</frag>
</root>
重点是文件1中的文件2的所有内容用于匹配属性(将有额外的元素,文件1中不存在我不想要的属性值),但保留顺序,选项卡结构,空格和文件1的评论。
这似乎是一个非常愚蠢的过程,但有很多大文件。我一直在阅读很多关于XSLT的内容,但我找不到任何解决方案,因为我完全不熟悉它。
非常感谢您提供任何可能的答案。
答案 0 :(得分:1)
Xslt 2.0
<xsl:key name="k1" match="element" use="@name"/>
<xsl:param name="lkp-url" select="'lookup.xml'"/>
<xsl:variable name="lkp-doc" select="doc($lkp-url)"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* , node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="element[@name and key('k1', @name, $lkp-doc)]">
<xsl:copy>
<xsl:copy-of select="@* , key('k1', @name, $lkp-doc)/node()"/>
</xsl:copy>
</xsl:template>
答案 1 :(得分:0)
对于像我这样努力运行此事的新手,需要进行一些修改。名为element
的所有元素都需要</frag>
替换为</element>
而且,对我来说,所选答案需要用以下内容封装:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
....
</xsl:stylesheet>