次の例のような XML ファイルがあります。
<Data>
<defect>
<record-id>1</record-id>
<custom-field-value field-name="Release Version" field-value="1.0"/>
<custom-field-value field-name="Other info" field-value=""/>
<custom-field-value field-name="More info" field-value="blah"/>
<event include-in-release-notes="yes">
<notes>This is a release note to include</notes>
</event>
<event include-in-release-notes="no">
<notes>This is not a release note</notes>
</event>
</defect>
<defect>
<record-id>2</record-id>
<custom-field-value field-name="Release Version" field-value="1.5"/>
<custom-field-value field-name="Other info" field-value=""/>
<custom-field-value field-name="More info" field-value="blah"/>
<event include-in-release-notes="yes">
<notes>This is a release note to include for 1.5</notes>
</event>
<event include-in-release-notes="no">
<notes>This is not a release note</notes>
</event>
</defect>
</Data>
私がやろうとしているのは、最初に @field-name が "Release Version" に等しい要素の一意の @field-value 値をすべて並べ替えて見つけるリリース ノート ドキュメントを作成することです。リリース バージョンに関連しない他の要素がある場合があります。ここに私が探している出力があります:
Release Version: 1.0
o This is a release note to include
Release Version: 1.5
o This is a release note to include for 1.5
Release Verison: x.x
o one release note
o another release note
「Muenchian」メソッドと並べ替えとグループ化についてたくさん読んだことがありますが、比較する必要がある属性があるという事実に苦労しています。私が読んだ例のほとんどは、はるかに直感的な要素の並べ替えについて説明しています。そして、複数の属性を見つけて並べ替える必要があります。まあ、私の頭は爆発し始めています。
以下を使用して、テキストとして「リリースバージョン」を持つすべての要素を提供するスタイルシートを思いつきました。
<xsl:key name="keyMajorReleases" match="custom-field-value" use="@field-name"/>
<xsl:for-each select=key('keyMajorReleases', 'Release Version')">
<xsl:sort order="descending" data-type="text" select="@field-value"/>
しかし、それはユニークなものだけでなく、それらすべてを私に与えてくれます. そして、印刷する必要があるリリースノートを持つ「イベント」要素を取得する方法がわかりません。
「generate-id()」を使用しようとすると、検索する値を持つ一意のエントリが 1 つしかないと推測されるため、結果は 1 つしか得られません。
<xsl:for-each select="//custom-field-value[generate-id(.)=generate-id(key('keyMajorReleases', 'Release Version')[1])]">