多输入上的 XSL 筛选器

XSL filter on Multiple input

提问人:Seong Y. H. 提问时间:7/7/2022 最后编辑:Seong Y. H. 更新时间:7/13/2022 访问量:91

问:

我正在尝试弄清楚需要如何以及在何处添加 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 &amp; 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 &amp; 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>

我设法让表单与品牌一起使用,但我不知道如何以这样的方式添加另一个组过滤器:

  1. 当品牌 = 全部 & 组 = 全部时,显示所有记录
  2. 当品牌 = ABC & Group = All 时,显示记录 PN080101、PN080102 和 EL040101
  3. 当品牌 = 全部 & 组 = PN08 时,显示记录 PN080101、PN080102 和 PN080103
  4. 当品牌 = ABC & 组 = EL04 时,显示记录EL040101

我应该把过滤器放在哪里?它与产品节点不在同一子节点上。我应该如何根据父节点过滤掉?

[($selected_group='all') or ($selected_group=./group)]
XML xslt xhtml

评论


答:

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 来联系作为 .parentgroupproduct