Функция поиска xsl: key key () больше / меньше чем - PullRequest
2 голосов
/ 18 декабря 2010

Есть ли способ выполнить поиск по ключу (), используя значение thanthan / lessthan?

пример: ключ ('akeyname', <8) вернул бы все узлы со значением строки ключа меньше 8. </p>

1 Ответ

3 голосов
/ 18 декабря 2010

Есть ли способ сделать поиск ключа () используя больше / меньше?

пример: ключ ('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.

...