- コメントに応じて編集*
こんにちは、
私はXSLT初心者であり、助けが必要です。XSLT 1.0でフィルター/グループの組み合わせを実行しようとしています(このアプリケーションではXSLT 2.0を使用できません)。
これがxmlの例です
<entry>
<item>
<name>Widget 2</name>
<rank>2</rank>
<types>
<type>Wood</type>
<type>Fixed</type>
<type>Old</type>
</types>
</item>
<item>
<name>Widget 1</name>
<rank>2</rank>
<types>
<type>Metal</type>
<type>Broken</type>
<type>Old</type>
</types>
</item>
<item>
<name>Widget 3</name>
<rank>1</rank>
<types>
<type>Metal</type>
<type>New</type>
</types>
</item>
</entry>
ここで私がやりたいのは、出力htmlです。ここで、XMLのサブセットを取得し、<type>
ランクに基づいてグループ化します。たとえば、ユーザーがタイプMetalのすべてのアイテムを選択した場合、出力は次のようになります。
<p class="nospace"><font color="#800000">
<b>Rank 1</b></font></p>
<li id="mylist"><b>Widget 3</b></li>
<br\>
<p class="nospace"><font color="#800000">
<b>Rank 2</b></font></p>
<li id="mylist"><b>Widget 1</b></li>
<br\>
ユーザーユーザーがタイプOldを選択した場合、出力は次のようになります。
<p class="nospace"><font color="#800000">
<b>Rank 2</b></font></p>
<li id="mylist"><b>Widget 1</b></li>
<li id="mylist"><b>Widget 2</b></li>
<br\>
ランクに沿ってキーを使用してグループ化するのは簡単ですが、両方を実行しようとしても機能しません。これが私が試したxsltのサンプルです:
<xsl:param name="typeParam"/>
<xsl:key name="byRank" use="rank" match="item"/>
<xsl:for-each select="item[count(.|key('byRank',rank)[1])=1]">
<xsl:sort data-type="number" select="rank"/>
<xsl:for-each select="key('byRank',rank)">
<xsl:sort select="name"/>
<xsl:if test="count(rank)>0">
<p class="nospace"><font color="#800000"><b>Rank<xsl:value-of select="rank"/></b></font></p>
<xsl:for-each select="types[types=$typeParam]">
<li id="mylist"><b><xsl:value-of select="../name"/></b></li>
</xsl:for-each>
<br/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
これから得られる結果は、実際に必要なxmlのサブセットを取得しますが、さまざまなランク値もすべて表示します。$typeParamで指定されたタイプのランクだけに制限したいと思います。
for-eachステートメントをコードの前半に移動し、ifステートメントを変更して$ typeParamを選択しようとしましたが、どちらも機能しません。キーをランクとタイプと連結しようとしましたが、それも機能しないようです($ typeParamのタイプがtypesの最初の子である場合にのみ機能します)。
ありがとう
ジェフ