xslt - xsl:模板选择语句与param匹配的问题

时间:2018-04-06 11:55:47

标签: xslt

我遇到以下代码问题。此代码从html页面中的文本框中获取值,然后从包含传入值的xml文件中获取所有路径

XML:

    <allstops>
      <stop number="2504" name="Main &amp; Bainard EB">
        <location>
          <latitude>42.91033567</latitude>
          <longitude>-81.29671483</longitude>
        </location>
        <routes>28</routes>
      </stop>
      <stop number="20" name="Adelaide &amp; Ada NB">
        <location>
          <latitude>42.9742886</latitude>
          <longitude>-81.2252341</longitude>
        </location>
        <routes>16</routes>
      </stop>
      <stop number="22" name="Adelaide &amp; Central Ave NB">
        <location>
          <latitude>42.9945666</latitude>
          <longitude>-81.2343441</longitude>
        </location>
        <routes>16</routes>
      </stop>

XSLT:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsfot-com:xslt" exclude-result-prefixes="msxsl"
      >

  <xsl:output method="html" indent="yes" />

  <xsl:param name="route" select="0"/>

  <xsl:template match="/">
    <h1>
      <font face="Verdana">
        LTC Stops on route <xsl:value-of select="$route"/>.
      </font>
    </h1>
    <h2>
      <font face="Verdana">
        <xsl:value-of select="count(//routes[contains(text(), $route)])"/> stops found.
      </font>
    </h2>
    <table style="width:720px" border="3">
      <tr>
        <th>
          <font face="Verdana" size="4">STOP #</font>
        </th>
        <th>
          <font face="Verdana" size="4">STOP NAME</font>
        </th>
        <th>
          <font face="Verdana" size="4">LAT</font>
        </th>
        <th>
          <font face="Verdana" size="4">LONG</font>
        </th>
        <th>
          <font face="Verdana" size="4">ROUTES</font>
        </th>
      </tr>
      <xsl:apply-templates select="//routes[contains(text(), $route)]" >
        <xsl:sort data-type="number" select="../@number" />
      </xsl:apply-templates>
    </table>
  </xsl:template>

  <xsl:template match="routes">
    <xsl:element name="tr">
      <xsl:element name="td">
        <xsl:value-of select="../@number"/>
      </xsl:element>
        <xsl:element name="td">
        <xsl:value-of select="../@name"/>
      </xsl:element>
        <xsl:element name="td">
        <xsl:value-of select="../location/latitude"/>
      </xsl:element>
        <xsl:element name="td">
        <xsl:value-of select="../location/longitude"/>
      </xsl:element>
        <xsl:element name="td">
        <xsl:value-of select="."/>
      </xsl:element>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

此代码有效,但有一个问题。如果用户输入路线号码&#39; 1&#39;它将匹配路线&#39; 10&#39; &#39; 11&#39; &#39; 12&#39;等等,只要路线包含第一名。另请注意,某些路由包含多个用逗号分隔的数字; 01,16,24。在这种情况下,用户输入&#39; 01&#39;应该仍然得到号码为“01,16,24&#39;”的路线。

2 个答案:

答案 0 :(得分:0)

当您使用XSLT 1.0时,一种方法是这样做......

<xsl:variable name="paddedRoute" select="concat(',', $route, ',')"/>
<xsl:value-of select="count(//routes[contains(concat(',', translate(text(), ' ', ''), ','), $paddedRoute)])"/>

如果所有translate元素都不包含空格,您可以删除routes

<xsl:value-of select="count(//routes[contains(concat(',', text(), ','), $paddedRoute)])"/>

请注意,路径应该真正作为字符串传递...

<xsl:param name="route" select="'16'"/>

答案 1 :(得分:0)

您为什么使用contains()?你肯定想要一个平等测试吗?变化

//routes[contains(text(), $route)]

//routes[. = $route]