XSLT与属性的另一个文件匹配“替换”值(XSLT “replace” values with an

2019-10-19 14:09发布

我想知道是否有可能从另一个文件采取相同的资源值(相同的属性值),在第一档保持所有的结构和评论。

也许我会用一个例子更好地解释它。

输入文件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,但我无法找到任何解决方案,我用它完全的新手。

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

Answer 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>


Answer 2:

对于任何新手,像我一样,谁是奋力奔跑这种情况,需要一些修正。 命名所有元素element需要</frag>与被替换</element>

而且,对我来说,所选择的答案需要与封装:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 ....
 </xsl:stylesheet>


文章来源: XSLT “replace” values with another file matching by attribute
标签: xml xslt