要匹配来自两个不同xml的属性值,请使用XSLT替换文本

时间:2018-03-26 11:02:01

标签: xslt-1.0 xslt-2.0

匹配两个不同xml文件中的属性值并替换文本 1. xml

<?xml version="1.0" encoding="UTF-8"?>
<hostids>
   <hostid id="001">Agent</hostid>
   <hostid id="002">test2</hostid>
</hostids>

2。 XML

<?xml version="1.0" encoding="UTF-8"?>
<resources>
   <resource>
      <host id="001">jaffar 123</host>
   </resource>
   <resource>
      <host id="002">school 234</host>
   </resource>
</resources>

输出:我需要

<hostids>
   <hostid id="001">jaffar 123</hostid>
   <hostid id="002">school 234</hostid>
</hostids>

1 个答案:

答案 0 :(得分:0)

定义一个键<xsl:key name="ref" match="resource/host" use="@id"/>,然后编写一个模板,检查交叉引用是否存在并替换内容,在XSLT 3中可以使用

<xsl:template match="hostid[key('ref', @id, $doc2)]/text()">{key('ref', ../@id, $doc2)}</xsl:template>

在XSLT 2中你需要

<xsl:template match="hostid[key('ref', @id, $doc2)]/text()">
  <xsl:value-of select="key('ref', ../@id, $doc2)"/>
</xsl:template>

https://xsltfiddle.liberty-development.net/6qM2e2r联机的XSLT 3样本

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:param name="doc2">
    <resources>
       <resource>
          <host id="001">jaffar 123</host>
       </resource>
       <resource>
          <host id="002">school 234</host>
       </resource>
    </resources>
  </xsl:param>

  <xsl:key name="ref" match="resource/host" use="@id"/>

  <xsl:template match="hostid[key('ref', @id, $doc2)]/text()">{key('ref', ../@id, $doc2)}</xsl:template>

</xsl:stylesheet>

显然你可以使用<xsl:param name="doc2" select="doc('file2.xml')"/>从另一个文件中读取第二个文档。