xml - 合并两个 XML 文件

标签 xml xslt

<分区>

我有两个具有以下格式的 XML 文件 文件1

<info>
  <organization_id>123</organization_id>
  <total_patients>5</total_patients>
</info>
<patients>
  <patient>
    <guid>1111</guid>
   </patient>
  <patient>
    <guid>2222</guid>
   </patient>
</patients>

文件 2

<info>
  <organization_id>456</organization_id>
  <total_patients>10</total_patients>
</info>
<patients>
  <patient>
    <guid>3333</guid>
   </patient>
  <patient>
    <guid>4444</guid>
   </patient>
</patients>

我想将两个文件合二为一,格式如下

输出文件

<info>
  <total_patients>15</total_patients>
</info>
<organizations>
  <organization>
      <organization_id>123</organization_id>
     <patients>
        <patient>
          <guid>1111</guid>
        </patient>
        <patient>
          <guid>1111</guid>
        </patient>
     </patients>
  </organization>
  <organization>
      <organization_id>456</organization_id>
     <patients>
        <patient>
          <guid>4444</guid>
        </patient>
        <patient>
          <guid>5555</guid>
        </patient>
     </patients>
  </organization>
</organizations>

如果有任何建议,我将不胜感激。我一直在搜索谷歌,找不到任何类似的东西。谢谢

最佳答案

进行一些调整以使您的输入和预期输出格式正确,我建议使用以下 XSLT 2.0 解决方案。调整是:

  1. 将每个输入文档封装到单个节点中。
  2. 将预期的输出文档封装到单个节点中。

因此,要转换以下文档....

<organization>
 <info>
  <organization_id>123</organization_id>
  <total_patients>5</total_patients>
 </info>
 <patients>
  <patient>
    <guid>1111</guid>
   </patient>
  <patient>
    <guid>2222</guid>
   </patient>
 </patients>
</organization>

包括以下共同输入文档...

<organization>
 <info>
  <organization_id>456</organization_id>
  <total_patients>10</total_patients>
 </info>
 <patients>
  <patient>
    <guid>3333</guid>
   </patient>
  <patient>
    <guid>4444</guid>
   </patient>
 </patients>
</organization> 

...将在您调用 XSLT 引擎时将其作为名称为“org2”的参数进行引用,应用以下 XSLT2 转换...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fn="http://www.w3.org/2005/xpath-functions"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  version="2.0"
  exclude-result-prefixes="xsl xs fn">

<xsl:output indent="yes" encoding="UTF-8" />
<xsl:param name="org2" />
<xsl:variable name="org2-doc" select="document($org2)" />

<xsl:template  match="/">
 <output>
  <info>
   <total_patients>
    <xsl:number value="organization/info/total_patients +
             $org2-doc/organization/info/total_patients" />
   </total_patients>
  </info>
   <organizations>
    <xsl:apply-templates />
    <xsl:apply-templates select="$org2-doc/*" />
   </organizations>
 </output>
</xsl:template>

<xsl:template  match="organization">
  <organization>
   <organization_id>
    <xsl:number value="info/organization_id" />
   </organization_id>
   <xsl:copy-of select="patients" />   
  </organization>
</xsl:template>

</xsl:stylesheet>

... 产生期望的结果....

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <info>
      <total_patients>15</total_patients>
   </info>
   <organizations>
    <organization>
       <organization_id>123</organization_id>
       <patients>
          <patient>
             <guid>1111</guid>
          </patient>
          <patient>
             <guid>2222</guid>
          </patient>
       </patients>
    </organization>
    <organization>
       <organization_id>456</organization_id>
       <patients>
          <patient>
             <guid>3333</guid>
          </patient>
          <patient>
             <guid>4444</guid>
          </patient>
       </patients>
    </organization>
   </organizations>
</output>

关于xml - 合并两个 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10287289/

相关文章:

c# - 使用 xsi :nil ="true" in C# 反序列化 XML 元素

java - 无法解析符号 AppCompat

xml - 使用 XSLT 替换 XML 属性中的换行符

xml - 重命名 XML 元素并用 XSLT 分隔逗号

xml - Notepad++ XML 自动完成/添加结束标记?

xml - Lua - 使用 LuaXML 进行 XML 解析

java - 与电子邮件地址的对话

java - 如何使用xsl :variable in xsl:choose

html - xslt disable-output-escaping 将非拉丁字符变成问号 "...???????????..."

html - 动态决定使用哪个 XSL 样式表