Html 仅使用XML节点不同值填充下拉列表

Html 仅使用XML节点不同值填充下拉列表,html,xml,xslt,xpath,xslt-grouping,Html,Xml,Xslt,Xpath,Xslt Grouping,我正在尝试生成一个搜索过滤器,该过滤器将使用现有的XML数据文件,并且我正在尝试在下拉列表框中仅显示其中一个节点的唯一值 XML文件的一个示例可以在。。。 我已经设法使用XSLT以更可读的格式显示XML。。。 已应用筛选器的相同数据。。。 我想在筛选出的第一个下拉列表框中列出的值。。。 将所有数据拉入HTML页面。。。 我正在努力找出如何从…获取数据。。。 进入HTML页面下拉列表框 谁能给我提供建议,给我指出正确的方向,或者确认我走在正确的轨道上 我试图实现的最终结果是有两个下拉框

我正在尝试生成一个搜索过滤器,该过滤器将使用现有的XML数据文件,并且我正在尝试在下拉列表框中仅显示其中一个节点的唯一值

XML文件的一个示例可以在。。。

我已经设法使用XSLT以更可读的格式显示XML。。。

已应用筛选器的相同数据。。。

我想在筛选出的第一个下拉列表框中列出的值。。。

将所有数据拉入HTML页面。。。

我正在努力找出如何从…获取数据。。。 进入HTML页面下拉列表框

谁能给我提供建议,给我指出正确的方向,或者确认我走在正确的轨道上

我试图实现的最终结果是有两个下拉框

下拉列表1将包含。。。刹车、排气、照明

下拉列表2将包含

  • 如果以前选择了制动器。。。光盘和鼓,垫和鞋
  • 如果之前选择了排气。。。中间,后面
  • 如果以前选择了照明。。。前照灯,尾灯

现在我只想把重点放在用上面讨论的数据填充下拉框1上。

通过更新的说明,看起来您想要创建一个包含不同组值的下拉框。这是一个分组问题的例子,在XSLT1.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>

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

XSLT1.0中对元素进行分组的标准技术之一是“Muenchian分组”(XSLT2.0实现本机分组函数和元素),它基于比较唯一ID

在下面的解决方案中,我假设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”中排序。

感谢您的输入。。。我已经编辑了我的帖子(等待批准),删除了显示数据的URL,因为这似乎会引起混乱。我已经修改了我的问题,添加了更多信息。感谢您的快速回复。我已经做了一个简短的测试,一切似乎都如预期的那样工作,非常感谢。。。我真的很感激!我将需要更多的时间来研究您的代码并更好地理解正在发生的事情。不幸的是,我现在要去度周末了,所以我必须在周一早上接这个电话。我会让你知道我进展如何。多亏了你,我现在明白了穆钦方法。我使用JS填充基于XML和XSL文档的HTML文档下拉列表。我在下拉列表中添加了onchange事件,并打印了所选内容,以确保存储了正确的值。同一个onchange函数从您提到的页面调用该函数。我将set param部分修改为docProcessor.setParameter(storeProductGroupValue);删除For循环,因为我应该只有1个参数要传入。下拉列表2没有运气:(在调试器中遍历JS时,您的
transformXml()
函数的参数名为
xmlURL
xslURL
,但实际代码中使用的变量名(在第一个
try{}
块和第二个块中)是
xmlDocURL
xslDocURL
。这肯定是一个问题。您能解决这个问题吗?另外,在添加参数时需要指定参数名:
docProcessor.addParameter(“group”,productGroupValue);
docProcessor.setParameter(null,“group”,productGroupValue)
感谢您的快速回复。我做了一个简短的测试,所有测试似乎都按照预期进行,非常感谢……我真的很感谢!由于JLRishe提供了有关我下一步的信息,我将继续从该答案开始工作。不幸的是,我现在要外出度周末,所以必须在周一早上接这个问题。我将让你知道我进展如何。
<select name="productType" id="productType">
  <option value="Headlamps">Headlamps</option>
  <option value="Rear Lights">Rear Lights</option>
</select>
<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>
<select>
    <option>Brakes</option>
    <option>Exhaust</option>
    <option>Lighting</option>
</select>