0

私はXMLにまったく慣れていないので、これを行う方法がわかりません。

次のXMLファイル1があるとします。

<Items>
<Item>
   <name> Item1 </name>
   <value> 10   </value>
</Item>
</Items>

およびファイル2:

<Items>
    <Item>
       <name> Item1 </name>
       <value> 20   </value>
    </Item>
    </Items>

XSLTを使用して、これら2つのアイテムの値フィールドを比較するにはどうすればよいですか?

4

1 に答える 1

1

次のようなスタイルシートを最初のXMLに適用し、2番目のXMLドキュメントのパスをとして渡すことができますparam(パラメーターを渡す方法については、XSLTプロセッサーのドキュメントを参照してください)。

<Item>テンプレートは、XML#1でそれぞれをチェック<name>し、他のXML($otherDoc//Item[name = $ownName][1]/value)で同じものを含む最初の項目を見つけて、それぞれを比較します<value>

次に、そのような比較ごとに1行のテキスト出力を生成します。

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

  <xsl:param name="otherDocPath" select="''" />

  <xsl:variable name="otherDoc" select="document($otherDocPath)" />

  <xsl:template match="/">
    <!-- handle each item in this document -->
    <xsl:apply-templates select="/Items/Item" />
  </xsl:template>

  <xsl:template match="Item">
    <xsl:variable name="ownName" select="name" />
    <xsl:variable name="ownValue" select="value" />
    <xsl:variable name="otherValue" select="$otherDoc//Item[name = $ownName][1]/value" />

    <!-- output one line of information per item -->
    <xsl:value-of select="concat($ownName, ': ')" />

    <xsl:choose>
      <xsl:when test="$ownValue = $otherValue">
        <xsl:value-of select="concat('same value (', $ownValue, ')')" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="concat('different (', $ownValue, '/', $otherValue, ')')" />
      </xsl:otherwise>
    </xsl:choose>

    <xsl:text>&#xA;</xsl:text><!-- new line -->
  </xsl:template>

</xsl:stylesheet>

名前/値の前後のスペースに注意してください。入力が実際にのように見える場合は、何かを比較/出力する前<value> 10 </value>に使用する必要があります(など)。normalize-space()<xsl:variable name="ownValue" select="normalize-space(value)" />

出力は次のようになります。

項目1:異なる(10/20)
項目2:同じ値(20)
アイテム3:異なる(20 /)

1行目と2行目は、両方のXMLドキュメントにあるアイテムを表し、3行目は最初のドキュメントにのみあるアイテムを表します。

もちろん、テキスト出力は1つの可能性にすぎません。さまざまな形式(XML、HTML)を出力できます。

于 2013-03-20T08:33:02.060 に答える