xslt3.0을 사용하여 xml에서 특정 노드 제거
현재 ID 템플릿을 사용하여 xslt3.0을 사용하여 xml에서 특정 노드를 제거하려고합니다. 그러나 이것은 처리 시간이 오래 걸립니다. Xslt30Transformer를 사용하여 성능을 개선하려면 몇 가지 제안이 필요합니다.
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="pathexcluded" select="'CATALOG/CD1 | CATALOG/CD2 '"/>
<xsl:variable name="changed-nodes" as="node()*" >
<xsl:evaluate xpath="$pathexcluded" context-item="/"/> </xsl:variable> <xsl:template match="node()|@*" name="identity"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="$changed-nodes">
</xsl:template>
</xsl:stylesheet>
답변
이전 예에서와 같이 대안은 정적 매개 변수와 그림자 속성을 사용하는 것입니다.
<xsl:param name="pathexcluded" as="xs:string" static="yes" select="'CATALOG/CD1 | CATALOG/CD2 '"/>
<xsl:template _match="{$pathexcluded}"/>
우리 xsl:evaluate
가 범인 인지 판단 할 수 있도록 성능 문제에 대한 세부 정보를 제공해야합니다 . 위의 내용은 주로 대체 접근 방식으로 게시되며 사용 사례에서 더 나은 성능을 발휘하는지 직접 테스트하십시오. 간단한 예제 xsl:variable
는 변환을 실행할 때 해당 부분이 변수인지 여부를 명확 하게 나타내지 않습니다.
BTW : XSLT 3 <xsl:mode on-no-match="shallow-copy"/>
에서는 ID 템플릿을 설정하는 대신 선언 할 수 있습니다 .
성능 질문은 수량화 할 수있는 경우에만 의미가 있습니다. 소스 문서의 크기는 얼마이며 소요되는 시간은 성능 요구 사항과 어떻게 비교됩니까?
xsl:evaluate
경로 표현식이 고정되어 있으므로 여기서 사용하는 이유를 알 수 없습니다 . 아마도 실제 코드에서 수정되지 않았습니까? 그러나 이것이 실제 코드가 아니라면 문제의 실제 원인을 보여주지 않았을 수도 있습니다. 확실히 그것이 큰 소스 문서이고 xsl : evaluate를 한 번만 평가한다면 문제의 원인이 아닐 것입니다.
<xsl:template match="$changed-nodes"/>
경우 힘이 아니라 문제가 $changed-nodes
매우 큰 노드 집합이다. 최근에이 문제를 해결하기 위해 몇 가지 작업을 한 것 같습니다. 어떤 Saxon 릴리스를 사용 중인지 말하지 않았습니다. 그러나 이러한 개선 사항에도 불구하고 각 노드를 테스트하여 삭제 기준과 일치하는지 확인하는 것이 그러한 모든 노드 집합을 구성한 다음 각 노드가 해당 집합의 구성원인지 확인하기 위해 테스트하는 것보다 낫습니다.