2

私は XSLT にまったく慣れていないので、ご容赦ください。

XSLT を使用して連結しようとしている 2 つの xml ファイルがあります。2 番目のファイルで指定された値が最初のファイルを上書きするように、ファイルを結合したいと考えています。例えば

firstFile.xml

<person>
  <person-name>Sandy</person-name>
  <person-age>21</person-age>
</person>

<person>
  <person-name>Bob</person-name>
  <person-age>15</person-age>
</person>

override.xml

<person>
  <person-name>Bob</person-name>
  <person-age>21</person-age>
</person>

結果:

<person>
  <person-name>Sandy</person-name>
  <person-age>21</person-age>
</person>
<person>
  <person-name>Bob</person-name>
  <person-age>21</person-age>
</person>

2 つのファイルを連結するための私のテンプレートは次のとおりです。

  <xsl:template match="/">
     <!-- MainFile -->
     <xsl:copy-of select="/*"/>

      <!-- Overrides-->
      <xsl:copy-of select="document($overrideFile)/*"/>
  </xsl:template>

各人を firstFile.xml にコピーする前に、override.xml に対応するノードがあるかどうかを確認するように for-each ループを設定しようとしましたが、失敗しました。

どんなヒントでも大歓迎です

4

1 に答える 1

3

この変換:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/>
 <xsl:variable name="vDoc2" select="document($pDoc2Url)"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <t>
    <xsl:apply-templates
       select="person[not(person-name = $vDoc2/*/person/person-name)]"/>
    <xsl:apply-templates select="$vDoc2/*/person"/>
  </t>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントの最初に適用された場合(単一のトップ要素にラップされ、整形式の XML ドキュメントになります):

<t>
    <person>
        <person-name>Sandy</person-name>
        <person-age>21</person-age>
    </person>
    <person>
        <person-name>Bob</person-name>
        <person-age>15</person-age>
    </person>
</t>

パラメータとして、2 番目のドキュメント (再び最上位の要素にラップされる) が存在するファイル名が渡されます。修正された 2 番目のドキュメントは次のとおりです。

c:/temp/delete/override.xml :

<t>
    <person>
        <person-name>Bob</person-name>
        <person-age>21</person-age>
    </person>
</t>

必要な正しい結果が生成されます。

<t>
   <person>
      <person-name>Sandy</person-name>
      <person-age>21</person-age>
   </person>
   <person>
      <person-name>Bob</person-name>
      <person-age>21</person-age>
   </person>
</t>

Ⅱ.より短いが柔軟性の低い解決策 -- アイデンティティ ルールも もありませんxsl:apply-templates:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pDoc2Url" select="'file:///c:/temp/delete/override.xml'"/>
 <xsl:variable name="vDoc2" select="document($pDoc2Url)"/>

 <xsl:template match="/*">
  <t>
    <xsl:copy-of
       select="person[not(person-name = $vDoc2/*/person/person-name)]"/>
    <xsl:copy-of select="$vDoc2/*/person"/>
  </t>
 </xsl:template>
</xsl:stylesheet>
于 2012-12-13T03:16:15.693 に答える