2010-07-07 4 views
8

일부 복잡한 XSLT 2.0 변환이 있습니다. 빈 태그가 출력되지 않도록하는 일반적인 방법이 있는지 알아 내려고합니다. 그래서 개념적으로 모든 빈 태그를 재귀 적으로 제거하는 최종 처리 단계입니다. 빈 태그를 제외하고 아무것도 수행하지 않는 별도의 XSLT로이 작업을 수행 할 수 있음을 알고 있지만 모두 단일 태그로 묶어야합니다.2 단계 처리 : 1 단계 XSLT 2.0 처리에서 빈 태그를 출력하지 마십시오.

+0

우수 질문 (+1). 자세한 해결책은 내 대답을 참조하십시오. –

답변

8

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"/> 
+0

이것은 전체적인 질문에 답을 해 주지만 특정 부분이 빠져서 - 모든 빈 태그를 재귀 적으로 제거하는 것입니다. 그래서 "* [not (node ​​())]"를 적절한 표현으로 변경해야합니다. 비어 있지 않은 자손이없는 노드. – mentics

+0

@taotree 다음 번에 더 나은 질문을하십시오. :) 나는이 새로운 요구 사항을 별도의 질문으로 만드는 것이 최선이라고 생각한다. 그것은 또한 훌륭한 질문이 될 것이다. 빈 템플릿의 패턴에 다음과 같이 사용할 수 있습니다.'* [not (descendant :: text())]' –

+0

@taotree 새 요구 사항을 반영하도록 해답을 업데이트했습니다. :) –