1

2 つの入力 xml ファイルがあります。テンプレート xml ファイルなど

<test>
  <a>0</a>
  <b>0</b>
  <c>0</c>
  <d>0</d>
  <e>0</e>
</test>

テンプレート xml の値をオーバーライドする値を指定するデータ xml ファイル。データ xml ファイルは、テンプレート xml のすべての要素の値を指定していない場合があります。

<test>
  <a>1</a>
  <b>2</b>
  <c>3</c>
</test>

また

<test>
  <e>5</e>
</test>

最終的な xml は、テンプレート xml にデータ xml を重ねたものである必要があります。例えば

<test>
  <a>1</a>
  <b>2</b>
  <c>3</c>
  <d>0</d>
  <e>0</e>
</test>

また

<test>
  <a>0</a>
  <b>0</b>
  <c>0</c>
  <d>0</d>
  <e>5</e>
</test>

これを XSLT でどのように行うことができますか?

4

1 に答える 1

0

そこにあるような深さのレベルが1つだけの場合、これは機能するはずです:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:param name="replacementFile" select="'replacements.xml'" />
  <xsl:param name="replacements" select="document($replacementFile)" />

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="*" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*/*">
    <xsl:variable name="replacement" 
           select="$replacements/*/*[local-name() = local-name(current())]" />
    <xsl:copy>
      <xsl:value-of select="$replacement | current()[not($replacement)]"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

最初の XML スニペットを入力ドキュメントとして、2 番目のスニペットを replacements.xml として保存すると、出力は次のようになります。

<test>
  <a>1</a>
  <b>2</b>
  <c>3</c>
  <d>0</d>
  <e>0</e>
</test>

置換がファイルに保存されていない場合は、代わりに、置換 XML ドキュメントを名前のパラメータ値として渡すことができますreplacements。上記の XSLT は同じままです。または、値ファイル内にあるが、別のファイルが別の時点で使用される可能性がある場合は、代わりに、名前のパラメーターとしてファイル パスを渡すことができますreplacementFile。繰り返しますが、上記の XSLT を変更する必要はありません。

于 2013-01-25T18:43:21.617 に答える