Сортировка списка при отправке параметра функции в xslt

Я создаю список (документ-фрагмент 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 на основе атрибута, а затем отправить в функцию.

Какую версию XSLT вы используете (XSLT 3 на основе XPath 3 имеет функцию sort, XSLT 2/3 имеет функцию xsl:perform-sort)? Где вы там используете функцию? Кажется, вы вызываете именованный шаблон, а не функцию?

Martin Honnen 10.09.2018 10:05

Я использую XSLT 2.0 .... Да, вызываю именованный шаблон

Karthik S K 10.09.2018 10:59

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

Karthik S K 10.09.2018 11:03
0
3
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Трудно задавать вопросы, не видя ввод 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-sorthttps://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 })"/>

Другие вопросы по теме