私はこのようなソートsophiscatedを持っている::実行-ソート
<xsl:perform-sort select="$nodes">
<xsl:sort select="if (p:isPreform(.) and not(p:getPreformPart(., $nodes))) then 1 else 0"/>
<xsl:sort select="p:getTargetPart(., $nodes)/../@pos"/>
<xsl:sort select="if (sort:isGroupElement(p:getTargetPart(., $nodes), $subsectionId)) then
sort:getGroupId(p:getTargetPart(., $nodes), $subsectionId)
else
p:getTargetPart(., $nodes)/@name"/>
<xsl:sort select="if (sort:isGroupElement(p:getTargetPart(., $nodes), $subsectionId)) then 0 else 1"/>
<xsl:sort select="replace(p:getTargetPart(., $nodes)/@number, '[А-Я]+$','')"/>
<xsl:sort select="if (p:isPreform(.)) then 1 else 0"/>
<xsl:sort select="@number"/>
</xsl:perform-sort>
あなたが内部の繰り返し構造を見ることができます。どのように私はこれをリファクタリングすることができますか?仕様それが事実であれば内部変数を宣言することはできませ - 同じフラグメントは、次のようになります。たぶん私は何かを逃し
<xsl:perform-sort select="$nodes">
<xsl:variable name="isPreform" select="p:isPreform(.)" as="xs:boolean"/>
<xsl:variable name="target" select="p:getTargetPart(., $nodes)" as="element()"/>
<xsl:variable name="isGrouped" select="sort:isGroupElement($target, $subsectionId)" as="xs:boolean"/>
<xsl:sort select="if ($isPreform and not(p:getPreformPart(., $nodes))) then 1 else 0"/>
<xsl:sort select="$target/../@pos"/>
<xsl:sort select="if ($isGrouped) then sort:getGroupId($target, $subsectionId) else $target/@name"/>
<xsl:sort select="if ($isGrouped) then 0 else 1"/>
<xsl:sort select="replace($target/@number, '[А-Я]+$','')"/>
<xsl:sort select="if ($isPreform) then 1 else 0"/>
<xsl:sort select="@number"/>
</xsl:perform-sort>
?私は別の方法でこれを並べ替えることができますか?
事前に感謝!アンドレイ。
私は変数の問題に対する解決策はありませんが、ブール条件に基づいてソートするようなところでは、 '1' /' 0'として計算されたソートキーがあります。ブール値が完璧にソート可能なので、これらの式を短縮することができます。https://www.w3.org/TR/xquery-operators/#op.booleanしたがって、($ isGroupedの場合) 'select =" then 0 else 1 "' 'select =" not($ isGrouped)) "と書かれ、他の式も同様です。 –
ヒントありがとうございます。私は、一時的な構造を作成し、各ノードのための計算された一意のidとfor-each内の属性を保存し、perform-sort内でこの属性を取得してソートを行います。 –