0

既存のXMLデータファイルで機能する検索フィルターを作成しようとしています。まず、ドロップダウンリストボックスにノードの1つからの一意の値だけを表示しようとしています。

XMLファイルの例は次の場所にあります... http://kirk.rapweb.co.uk/testing/filter/tidy/plain/products.xml

XSLTを使用してXMLをより読みやすい形式で表示することができました... http://kirk.rapweb.co.uk/testing/filter/tidy/products.xml

フィルタを適用した同じデータ... http://kirk.rapweb.co.uk/testing/filter/tidy/filter/products.xml

フィルターで除外された最初のドロップダウンリストボックスにリストしたい値... http://kirk.rapweb.co.uk/testing/filter/tidy/distinct/products.xml

HTMLページに取り込まれたすべてのデータ... http://kirk.rapweb.co.uk/testing/filter/tidy/html/

http://kirk.rapweb.co.uk/testing/filter/tidy/distinct/products.xmlから HTMLページのドロップダウンリストボックスにデータを取得する方法を見つけるのに苦労してい ます。

誰かがアドバイスを提供したり、私を正しい方向に向けたり、私が正しい方向に進んでいることを確認したりできますか?

私が達成しようとしている最終結果は、2つのドロップダウンボックスを持つことです。

ドロップダウンリスト1には...ブレーキ、排気、照明が含まれます

ドロップダウンリスト2には...が含まれます。

  • 以前にブレーキが選択されていた場合...ディスクとドラム、パッドと靴。
  • 以前にエキゾーストが選択されていた場合...センター、リア。
  • 以前に照明が選択されていた場合...ヘッドランプ、リアライト。

今は、ドロップダウンボックス1に上記のデータを入力することに焦点を当てたいと思います。

4

2 に答える 2

1

データにいくつの異なる「グループ」が含まれるかわからないという仮定の下にあると思います(つまり、誰かがいつでも新しいグループを追加できるのではないでしょうか?)。

要素をグループ化するためのXSLT1.0の標準的な手法の1つは、一意のIDの比較に基づく「MuenchianGrouping」(XSLT 2.0はネイティブのグループ化関数と要素を実装します)です。

次のソリューションでは、XMLドキュメントのデータがまだグループ化されていないと想定しています。

<xsl:key name="group-key"
         match="product"
         use="group" />

<xsl:template match="dataroot"> 
    <select>
        <xsl:for-each select="product[generate-id(.) = generate-id(key('group-key', group)[1])]">
            <!-- We sort the group names alphabetically. If the names of the groups are already ordered alphabetically, the xsl:sort can be omitted. -->
            <xsl:sort select="group" />
            <option><xsl:value-of select="group" /></option>
        </xsl:for-each>
    </select>
</xsl:template>

このテンプレートを(xsl:stylesheet要素を追加して)元の「product.xml」に適用した結果は次のとおりです。

<select>
    <option>Brakes</option>
    <option>Exhaust</option>
    <option>Lighting</option>
</select>

注:「xsl:sort」要素を削除しても、データは「product.xml」ですでに順序付けられているため、出力は同じになります。

于 2013-02-08T15:37:13.410 に答える
1

更新された説明を使用して、個別のグループ値を使用してドロップダウンを作成するように見えます。これはグループ化の問題の例であり、XSLT 1.0では、これを行う方法はMuenchianグループ化と呼ばれる手法を使用することです。こんなふうになります:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:key name="kGroup" match="product" use="group"/>

  <xsl:template match="/">
    <select name="productGroup" id="productGroup">
      <xsl:apply-templates 
        select="dataroot/product[generate-id() = 
                                 generate-id(key('kGroup', group)[1])]" />
    </select>
  </xsl:template>

  <xsl:template match="product">
    <option value="{group}">
      <xsl:value-of select="group"/>
    </option>
  </xsl:template>
</xsl:stylesheet>

入力XMLで実行すると、次のように生成されます。

<select name="productGroup" id="productGroup">
  <option value="Brakes">Brakes</option>
  <option value="Exhaust">Exhaust</option>
  <option value="Lighting">Lighting</option>
</select>

次に、現在使用しているのと同じJavaScriptを使用して、IDで簡単に見つけられるHTMLDOMの特定の要素内に結果を配置します。

次のステップとして、上記が機能したら、このドロップダウンにJavaScriptイベントを配置して、アイテムが選択されたときに別の変換を実行するようにします。この選択された値を取得し、これをパラメーター値としてさらに別のXSLTに渡すことができます。このページには、JavaScriptでXSLTにパラメーターを渡すための適切な情報があります。XSLTは次のようになります(Muenchianグループ化を使用した場合も同様です)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" omit-xml-declaration="yes"/>
  <xsl:key name="kType" match="product" use="type"/>

  <xsl:param name="group" />

  <xsl:template match="/">
    <select name="productType" id="productType">
      <xsl:apply-templates 
        select="dataroot/product[generate-id() = 
                     generate-id(key('kType', type)[1])][group = $group]" />
    </select>
  </xsl:template>

  <xsl:template match="product">
    <option value="{type}">
      <xsl:value-of select="type"/>
    </option>
  </xsl:template>
</xsl:stylesheet>

パラメータ値「Lighting」がgroupパラメータとして渡され、これが入力XMLで実行されると、次のようになります。

<select name="productType" id="productType">
  <option value="Headlamps">Headlamps</option>
  <option value="Rear Lights">Rear Lights</option>
</select>
于 2013-02-08T14:19:05.643 に答える