この質問では、XSLT を使用して同じ値が連続して出力されるのを防ぐことができるかどうかを尋ねました。この質問では、XSLT 1.0 構文のMuenchian Grouping メソッドがより明確になるように、入力データを拡張します。
XSL 変換を使用して、XML ドキュメント内の値の最初の出現のみを照合することは可能ですか?
f2,f3 内のすべての値を出力したいのですが、順序を保持して f1 の内容の最初のインスタンスのみを出力します。
XML データ
<doc>
<datum>
<f1>One</f1>
<f2>Monday</f2>
<f3>January</f3>
</datum>
<datum>
<f1>One</f1>
<f2>Tuesday</f2>
<f3>February</f3>
</datum>
<datum>
<f1>Two</f1>
<f2>Wednesday</f2>
<f3>March</f3>
</datum>
</doc>
出力
One
-Monday-January
-Tuesday-February
Two
-Wednesday-March
これは、フィールド f1 および f2 を含む入力データ セットに対して、Dimitre Novatchev によって XSLT 1.0 用に提案されたソリューションです。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kDatumByF1" match="datum" use="f1"/>
<xsl:template match=
"datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
<xsl:value-of select="concat('
', f1)"/>
<xsl:apply-templates select="key('kDatumByF1', f1)/f2" mode="inGroup"/>
</xsl:template>
<xsl:template match="f2" mode="inGroup">
- <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
それは非常にうまく機能しますが、出力にフィールド「f3」を含めるために拡張する構文がわかりません。