2

我有两个 XML 文件,格式如下 File 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>

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

4

2 回答 2

4

进行一些调整以使您的输入和预期输出形成良好的格式,我建议使用以下 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>
于 2012-04-24T05:57:51.843 回答
2

以您熟悉的任何语言使用 XML DOM 解析器。解析这两个文件,提取组织 ID。创建一个新的 DOM 树,一个新<info>节点,一个新<organizations>节点。对于每个组织,复制<patients>相应组织节点下的节点。序列化生成的 XML。

(如果您愿意,可以尝试 XSLT,但这条路虽然可能更短,但可能会让人觉得有些自虐。)

不,我懒得真正为你编写工作代码。

于 2012-04-23T20:01:58.237 回答