Сортировка списка при отправке параметра в функцию в XSLT - PullRequest
0 голосов
/ 10 сентября 2018

Я создаю список (фрагмент документа XML) на основе определенных условий, и я хотел отсортировать на основе одного из атрибутов в списке?Как я могу добиться этого

это шаблон вызова

<xsl:call-template name="tempDiagnosisByNomenId">
    <xsl:with-param name="dxNomenId" select="$nomenId"/>
    <xsl:with-param name="dxList" select="key('keyDxByNomenId', $nomenId, $root-node)[@is-active='true']"/>
    <xsl:with-param name="hasDxOrders" select="$hasDxOrders"/>
</xsl:call-template>

Я хочу отсортировать параметр dxList на основе атрибута, а затем отправить в функцию.

1 Ответ

0 голосов
/ 10 сентября 2018

Трудно задавать вопросы, не видя ввод XML, но если вы измените

<xsl:with-param name="dxList" select="key('keyDxByNomenId', $nomenId, $root-node)[@is-active='true']"/>

до

<xsl:with-param name="dxList" as="node()*">
  <xsl:perform-sort select="key('keyDxByNomenId', $nomenId, $root-node)[@is-active='true']">
    <xsl:sort select="@some-attribute"/>
  </xsl:perform-sort>
</xsl:with-param>

тогда узлы, возвращаемые вызовом функции key, должны передаваться как параметр dxList, отсортированный по атрибуту some-attribute, а не в обычном порядке документа, который возвращает вызов функции key. Смотрите спецификацию на perform-sort https://www.w3.org/TR/xslt20/#element-perform-sort.

В качестве альтернативы вы можете определить функцию с xsl:function, которая имеет один входной параметр и использует xsl:perform-sort в теле функции, тогда вы можете сделать xsl:with-param более компактным, вызвав эту функцию в select выражение.

А в XSLT 3 с поддержкой функций более высокого порядка вы можете использовать функцию sort напрямую, например,

<xsl:with-param name="dxList" select="sort(key('keyDxByNomenId', $nomenId, $root-node)[@is-active='true'], (), function($node) { $node/@some-attribute })"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...