【问题标题】:xsl:key key() function lookup greater than/less thanxsl:key key() 函数查找大于/小于
【发布时间】:2010-12-18 18:35:12
【问题描述】:

有没有办法使用大于/小于进行 key() 查找?

示例:key('akeyname',

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获取解释和解决方案。 :)

标签: xslt xslt-2.0 xpath-2.0 fxsl


【解决方案1】:

有没有办法进行 key() 查找 使用大于/小于?

示例:key('akeyname',

不可以,因为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 的标准功能。

【讨论】:

  • +1。阅读您的答案非常有用。将 true 作为关键参数传递是一个很棒的解决方案。
  • @Flack:不客气。我会尽快用更有趣的东西更新这个答案。
  • 一个很好的答案,谢谢。至少我知道我不是简单地忽略了一些简单的语法。我认为查找更像是一个字符串,而不是 xpath 语句。当我有机会时,我会发布更多关于我正在尝试做的事情的背景信息。
  • @Darin-Walsh:不客气。 :) 请参阅我的更新,该更新显示使用 HOF 作为更灵活的解决方案。
  • +1 表示我没有想到的解决方案,也适用于 FXSL 示例。我越看越对 FXSL 感兴趣。如果您有一些推荐的资源(除了显而易见的 FXSL 网站),请分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多