xsl:key key()函数查找大于/小于

时间:2010-12-18 18:35:13

标签: xslt xslt-2.0 xpath-2.0 fxsl

有没有办法使用greaterthan / lessthan进行key()查找?

示例:key('akeyname',< 8)将返回键字符串值小于8的所有节点。

1 个答案:

答案 0 :(得分:3)

  

有没有办法进行key()查找   使用greaterthan / lessthan?

     

示例:key('akeyname',< 8)会   使用密钥字符串返回所有节点   值小于8

不,因为key()函数的第二个参数必须是表达式,但"<8"不是语法上合法的XPath表达式。

最接近您想要的

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kLT8" match="num" use="not(. >= 8)"/>

 <xsl:template match="/">
  <result>
   <xsl:copy-of select="key('kLT8', 'true')"/>
  </result>
 </xsl:template>
</xsl:stylesheet>

应用于此XML文档时

<nums>
  <num>01</num>
  <num>05</num>
  <num>03</num>
  <num>04</num>
  <num>08</num>
  <num>06</num>
  <num>07</num>
  <num>02</num>
  <num>09</num>
  <num>10</num>
</nums>

产生了想要的正确结果

<result>
   <num>01</num>
   <num>05</num>
   <num>03</num>
   <num>04</num>
   <num>06</num>
   <num>07</num>
   <num>02</num>
</result>

更灵活的解决方案是在XSLT中使用高阶函数(HOF),它已由FXSL library 实现多年(完全用XSLT编写)。

以下是使用HOF的解决方案:

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:f="http://fxsl.sf.net/">
 <xsl:import href="../f/func-Operators.xsl"/>
 <xsl:import href="../f/func-filter.xsl"/>

 <xsl:param name="pLimit" as="xs:integer" select="8"/>

 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:sequence select="f:filter(*/number(), f:gt($pLimit))"/>
 </xsl:template>
</xsl:stylesheet>

当在同一个XML文档(上面)上应用此转换时,会生成所需的正确结果

1 5 3 4 6 7 2

注意:即将推出的3.0版本,HOF将成为XPath / XSLT / XQuery的标准功能。