일부 복잡한 XSLT 2.0 변환이 있습니다. 빈 태그가 출력되지 않도록하는 일반적인 방법이 있는지 알아 내려고합니다. 그래서 개념적으로 모든 빈 태그를 재귀 적으로 제거하는 최종 처리 단계입니다. 빈 태그를 제외하고 아무것도 수행하지 않는 별도의 XSLT로이 작업을 수행 할 수 있음을 알고 있지만 모두 단일 태그로 묶어야합니다.2 단계 처리 : 1 단계 XSLT 2.0 처리에서 빈 태그를 출력하지 마십시오.
답변
2.0 변환 처리 수행 할 수있다 (이 경우, 2 패스) 방식 멀티 패스 도시이 XSLT :
<nums>
<num>01</num>
<num>02</num>
<num>03</num>
<num>04</num>
<num>05</num>
<num>06</num>
<num>07</num>
<num>08</num>
<num>09</num>
<num>10</num>
</nums>
이 XML 문서 적용
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*" mode="#all">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="vPass1">
<xsl:apply-templates/>
</xsl:variable>
<xsl:apply-templates select="$vPass1/*" mode="non-empty"/>
</xsl:template>
<xsl:template match="text()[xs:integer(.) mod 2 eq 0]"/>
<xsl:template match="*[not(node())]" mode="non-empty"/>
</xsl:stylesheet>
첫 번째 단계 ($vPass1
변수에 캡처 됨)에 결과 문서를 생성합니다.이 경우 모든 내용이 intege 인 내용의 <num>
요소 r은 내용에서 제거되어 비어 있습니다. 그런 다음 두 번째 단계에서 특정 모드로 적용되면 모든 비어있는 요소가 제거됩니다.
변환의 결과는입니다 :
<nums>
<num>01</num>
<num>03</num>
<num>05</num>
<num>07</num>
<num>09</num>
</nums>
이 모드의 사용, 특별한 모드
#all
및 #current
주의 마십시오. 업데이트 : OP는 이제 "재귀 적으로" "비어 있지 않은 자손이없는 모든 노드"를 주석으로 삭제하려고합니다.
이것은 명시 적 재귀를 사용하지 않고보다 간단하게 구현할 수 있습니다. 그냥 변경 :
<xsl:template match="*[not(node())]" mode="non-empty"/>
에 :
<xsl:template match="*[not(descendant::text())]" mode="non-empty"/>
이것은 전체적인 질문에 답을 해 주지만 특정 부분이 빠져서 - 모든 빈 태그를 재귀 적으로 제거하는 것입니다. 그래서 "* [not (node ())]"를 적절한 표현으로 변경해야합니다. 비어 있지 않은 자손이없는 노드. – mentics
@taotree 다음 번에 더 나은 질문을하십시오. :) 나는이 새로운 요구 사항을 별도의 질문으로 만드는 것이 최선이라고 생각한다. 그것은 또한 훌륭한 질문이 될 것이다. 빈 템플릿의 패턴에 다음과 같이 사용할 수 있습니다.'* [not (descendant :: text())]' –
@taotree 새 요구 사항을 반영하도록 해답을 업데이트했습니다. :) –
우수 질문 (+1). 자세한 해결책은 내 대답을 참조하십시오. –