使用XML节点填充下拉列表只有不同的值

问题描述:

我想要生成一个搜索筛选器,它将与现有的XML数据文件一起工作,并且我正在尝试仅显示来自某个节点的唯一值下拉列表框。使用XML节点填充下拉列表只有不同的值

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。

随着您的更新deading,它看起来像你想创建一个具有不同的组值的下拉列表。这是一个分组问题的例子,在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 HTML DOM中的元素可以通过其ID轻松找到。

至于下一步,一旦上述工作正常,您将在此下拉列表中放置JavaScript事件,以便在选择某个项目时运行另一个转换。你会得到这个选定的值,然后你可以将它传递给另一个XSLT作为参数值。 This page具有关于在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> 

当参数值“照明”传递中作为group参数,这是您的输入XML运行,这将产生:

<select name="productType" id="productType"> 
    <option value="Headlamps">Headlamps</option> 
    <option value="Rear Lights">Rear Lights</option> 
</select> 
+0

感谢您的输入......我编辑了我的帖子(等待批准)以删除显示过滤到刹车的数据的URL,因为这似乎造成了混淆。 我修改了我的问题以包含其他信息。 – user1503689 2013-02-08 15:22:47

+0

感谢您的快速响应。 我已经做了一个简短的测试,并且所有工作都按预期工作,非常感谢......我真的很感激! 我需要一些时间来研究你的代码,并更好地理解发生了什么。不幸的是,我现在正要离开这个周末,因此周一早上将不得不选择这个。 我会让你知道我是如何得到的。 – user1503689 2013-02-08 16:10:07

+0

现在我明白了Muenchian Method,感谢http://www.jenitennison.com/xslt/grouping/muenchian.html。我使用JS来填充基于XML和XSL文档的HTML Doc Drop Down。 http://kirk.rapweb.co.uk/testing/filter/tidy/new/index.htm。我已将onchange事件添加到Drop Down并打印选择以确保存储正确的值。相同的onchange函数会从您提到的页面调用该函数。我修改了设置参数部分,以docProcessor.setParameter(storeProductGroupValue);删除For循环,因为我应该只有1个参数通过。没有运气与下拉2. :( – user1503689 2013-02-11 12:06:13

我想你是假设你不知道数据中会有多少不同的“组”(我的意思是,有人可以随时添加一个新组,不是?)。

XSLT 1.0中用于分组元素的一种标准技术是'Muenchian Grouping'(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:排序'元素,输出将是相同的,因为数据已经在'product.xml'中进行了排序。

+0

感谢您的快速响应。我已经做了一个简短的测试,并且所有工作都按预期工作,非常感谢......我非常感谢!由于JLRishe提供了关于下一步的信息,我将继续努力解决这个问题。不幸的是,我现在正要离开这个周末,因此周一早上将不得不选择这个。我会让你知道我如何继续。 – user1503689 2013-02-08 16:15:23