2

次の形式の 2 つの 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>

2つのファイルを次の形式で1つに結合したい

出力ファイル

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

提案をいただければ幸いです。私はGoogleを検索してきましたが、これに似たものは見つかりませんでした. ありがとうございました

4

2 に答える 2

4

入力と期待される出力が適切な形式になるようにいくつかの調整を行い、次の XSLT 2.0 ソリューションを提案します。調整は次のとおりです。

  1. 各入力ドキュメントを単一のノードに囲みます。
  2. 予想される出力ドキュメントを 1 つのノードに囲みます。

ということで、以下の文書を変形すると……

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

...これは、「org2」という名前のパラメーターとして XSLT エンジンの呼び出しで参照され、次の 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

使い慣れた任意の言語でXMLDOMパーサーを使用します。両方のファイルを解析し、組織IDを抽出します。新しいDOMツリー、新しい<info>ノード、新しいノードを作成し<organizations>ます。組織ごとに、<patients>対応する組織ノードの下にノードをコピーします。結果のXMLをシリアル化します。

(もしあなたがそんなに傾いているなら、あなたはXSLTを試すことができます、しかしこの道はおそらくもっと短いですが、どういうわけかマゾヒスティックに感じるかもしれません。)

いいえ、私はあなたのために実際に動作するコードを書くのが面倒です。

于 2012-04-23T20:01:58.237 に答える