次のようなスタイルシートを最初の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>
</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)を出力できます。