나는이 같은 sophiscated 정렬이 있습니다어떻게 XSL 내부 변수를 선언하려면 다음을 수행-종류의
<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이므로 'select = "if ($ isGrouped) then 0 else 1"'이 될 수 있습니다. 'select = "not ($ isGrouped))'''로 쓰여지고 다른 표현식에 대해서도 마찬가지입니다. –
힌트를 보내 주셔서 감사합니다. 임시 구조를 생성하고 각 노드에 대해 계산 된 고유 ID와 for-each 내부의 특성을 저장 한 다음 perform-sort 내부에서이 특성을 가져 와서 정렬을 수행합니다. –