xslt - xsl :key key() function lookup greater than/less than

标签 xslt xslt-2.0 xpath-2.0 fxsl

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

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

最佳答案

Is there a way to do a key() lookup using greaterthan/ lessthan?

example: key('akeyname', <8) would return all nodes with the key string value less than 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

注意:HOF 将在即将发布的 3.0 版本中成为 XPath/XSLT/XQuery 的标准功能。

关于xslt - xsl :key key() function lookup greater than/less than,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479441/

相关文章:

xml - 转换 xs :double to xs:integer in xPath 2. 0

xml - 计算xpath中子项的特殊文本

xml - 如何使用 XSLT 1.0 获取小写的 xml 节点

.net - .NET 中 XSLT 2.0 可用性的当前状态是什么

xslt - 使用 XSLT 翻译 XML 文件

XSLT 2.0 通过变量选择特定节点与直接选择

xpath - Telegram 即时查看 API : Element <img> is not supported in <p>

xml - 如何使用 XSLT 重命名父级和子级 XML 节点?

java - 当 saxon xslt 处理器抛出运行时错误时,如何防止 Tomcat 关闭?

.net - 如何在 XSLT 中调用点网程序集/命名空间