Я создаю список (документ-фрагмент 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 2.0 .... Да, вызываю именованный шаблон
Я хочу отсортировать список dxList на основе клинического приоритета, а затем отправить в функцию
Трудно задавать вопросы, не видя ввод 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 })"/>
Какую версию XSLT вы используете (XSLT 3 на основе XPath 3 имеет функцию
sort
, XSLT 2/3 имеет функциюxsl:perform-sort
)? Где вы там используете функцию? Кажется, вы вызываете именованный шаблон, а не функцию?