XSLT"替换"值与另一个按属性匹配的文件

时间:2014-03-14 21:00:22

标签: xml xslt

我想知道是否可以从另一个文件中获取相同资源(相同属性值)的值,在第一个文件中保留所有结构和注释。

也许我会用一个例子来解释它。

输入文件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的内容,但我找不到任何解决方案,因为我完全不熟悉它。

非常感谢您提供任何可能的答案。

2 个答案:

答案 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>