提问人:Seong Y. H. 提问时间:7/7/2022 最后编辑:Seong Y. H. 更新时间:7/13/2022 访问量:91
多输入上的 XSL 筛选器
XSL filter on Multiple input
问:
我正在尝试弄清楚需要如何以及在何处添加 XSL 过滤器以过滤掉多个输入。下面是我的 XML:
<?xml version="1.0" encoding="utf-8"?>
<product_list>
<brands>
<brand id="A1" name="ABC">ABC Brand</brand>
<brand id="A2" name="DEF">DEF Brand</brand>
</brands>
<groups>
<group id="PN08" name="Air Pneumatic Parts"/>
<group id="EL04" name="Lamps & Electrical Parts"/>
<group id="GE06" name="General Parts"/>
</groups>
<group id="PN08" name="Air Pneumatic Parts">
<product id="PN080101">
<name>Clutch Servo - SCANIA</name>
<brand>ABC</brand>
</product>
<product id="PN080102">
<name>Clutch Servo - VOLVO</name>
<brand>ABC</brand>
</product>
<product id="PN080103">
<name>Clutch Servo - DAF</name>
<brand>DEF</brand>
</product>
</group>
<group id="EL04" name="Lamps & Electrical Parts">
<product id="EL040101">
<name>Headlamp - MERCEDES</name>
<brand>ABC</brand>
</product>
</group>
</product_list>
和我的 XSL:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:param name="selected_brand" select="'all'"/>
<xsl:param name="selected_group" select="'all'"/>
<xsl:param name="Page" select="0" />
<xsl:template match="/">
<html>
<body>
<xsl:value-of select='$selected_brand'/> Brand, <xsl:value-of select='$selected_group'/> Group, Page: <xsl:value-of select='$Page'/><br/>
<form method="post" action="t1.asp">
<table>
<tr>
<td>
Brand
<select name="brand" value="{$selected_brand}" onchange="submit()">
<option value="all">
<xsl:if test="$selected_brand='all'">
<xsl:attribute name="selected">Selected</xsl:attribute>
</xsl:if>
All</option>
<xsl:for-each select="product_list/brands/brand">
<option value="{@name}">
<xsl:if test="$selected_brand=@name">
<xsl:attribute name="selected">Selected</xsl:attribute>
</xsl:if>
<xsl:value-of select="@name" /> </option>
</xsl:for-each>
</select>
</td>
<td>
Group
<select name="group" value="{$selected_group}" onchange="submit()">
<option value="all">
<xsl:if test="$selected_group='all'">
<xsl:attribute name="selected">Selected</xsl:attribute>
</xsl:if>
All</option>
<xsl:for-each select="product_list/groups/group">
<option value="{@name}">
<xsl:if test="$selected_group=@name">
<xsl:attribute name="selected">Selected</xsl:attribute>
</xsl:if>
<xsl:value-of select="@name" /> </option>
</xsl:for-each>
</select>
</td>
</tr>
</table>
</form>
<br/>
<xsl:apply-templates select="product_list"/>
</body>
</html>
</xsl:template>
<xsl:template match="product_list">
<table class="catalog_table">
<xsl:apply-templates select="group"/>
</table>
</xsl:template>
<xsl:template match="group">
<xsl:apply-templates select="product[($selected_brand='all') or ($selected_brand=./brand)]">
<xsl:sort select="product[@id]"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="product">
<tr>
<td><xsl:value-of select="position()"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="brand"/></td>
</tr>
</xsl:template>
</xsl:stylesheet>
我设法让表单与品牌一起使用,但我不知道如何以这样的方式添加另一个组过滤器:
- 当品牌 = 全部 & 组 = 全部时,显示所有记录
- 当品牌 = ABC & Group = All 时,显示记录 PN080101、PN080102 和 EL040101
- 当品牌 = 全部 & 组 = PN08 时,显示记录 PN080101、PN080102 和 PN080103
- 当品牌 = ABC & 组 = EL04 时,显示记录EL040101
我应该把过滤器放在哪里?它与产品节点不在同一子节点上。我应该如何根据父节点过滤掉?
[($selected_group='all') or ($selected_group=./group)]
答:
0赞
Jukka Matilainen
7/9/2022
#1
由于您首先选择组,然后选择组内的产品,因此可以将筛选放在第 59 行:
<xsl:apply-templates select="group"/>
通过将其更改为如下所示的内容:
<xsl:apply-templates select="group[$selected_group='all' or $selected_group=./@id]"/>
或者,如果你想把所有的过滤都放在一个地方,你可以把它放在第64行:
<xsl:apply-templates select="product[($selected_brand='all') or ($selected_brand=./brand)]">
将其更改为:
<xsl:apply-templates select="product[($selected_brand='all' or $selected_brand=./brand) and
($selected_group='all' or $selected_group=parent::group/@id)]">
在这里,关键是使用 axis 来联系作为 .parent
group
product
评论