Есть ли способ сделать поиск ключа ()
используя больше / меньше?
пример: ключ ('akeyname', <8) будет
вернуть все узлы с ключевой строкой
значение менее 8 </p>
Нет, поскольку второй аргумент функции 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>
Более гибким решением является использование функций высшего порядка (HOF) в XSLT, которые годами применяются библиотекой FXSL (полностью написанной на 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 станут стандартной функцией XPath / XSLT / XQuery в следующей версии 3.0.