2015-02-07 5 views
0

예외가있는 빈 태그를 제거하고 싶습니다.
예외가있는 모든 빈 태그를 제거하기 위해 XSL을 만들었습니다. 아래의 XSL 다음은XSL에서 conditons가있는 모든 빈 태그를 제거하는 방법

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:strip-space elements="*"/> 
<xsl:preserve-space elements="cEAN"/ priority="1"> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/> 
</xsl:stylesheet> 

아래의 규칙을 다음 XML, 그것은 잘 작동하고,

<?xml version="1.0" encoding="utf-8"?> 
    <NFe xmlns:n0="http://mynamespace"> 
    <cProd>0000000000001</cProd> 
    <cEAN> </cEAN> 
    <xProd>ARV NAT</xProd> 
    <NCM>01000</NCM> 
    <CFOP>9999</CFOP> 
    </uCom> 
</Nfe> 

변환 XML :

<?xml version="1.0" encoding="UTF-8"?> 
<NFe xmlns:n0="http://mynamespace"> 
    <cProd>0000000000001</cProd> 
    <cEAN /> 
    <xProd>ARV NAT</xProd> 
    <NCM>01000</NCM> 
    <CFOP>9999</CFOP> 
</NFe> 

그러나 XML은 아래의 규칙을 다음과 같은 경우 , 작동하지 않습니다.

<?xml version="1.0" encoding="utf-8"?> 
    <NFe xmlns:n0="http://mynamespace"> 
    <cProd>0000000000001</cProd> 
    <cEAN/> 
    <xProd>ARV NAT</xProd> 
    <NCM>01000</NCM> 
    <CFOP>999</CFOP> 
    <uCom/> 
    </Nfe> 

변환 XML :

<?xml version="1.0" encoding="UTF-8"?> 
<NFe xmlns:n0="http://mynamespace"> 
    <cProd>0000000000001</cProd> 
    <xProd>ARV NAT</xProd> 
    <NCM>01000</NCM> 
    <CFOP>9999</CFOP> 
</NFe> 

태그 cEAN이 유지되지 않고 모든 빈 태그를 제거합니다.

누군가 나를 도울 수 있습니까?

+0

질문을 이해할 수 없습니다. 비어있는 ''태그 **가 삭제되지 않는 이유는 무엇입니까? 당신은 "예외가있는 모든 빈 태그를 제거하기 위해 XSL을 만들었습니다 *"라고 말합니다. 그 예외는 보이지 않습니다. 두 번째 템플릿은 ** 모든 ** 빈 태그 ** 및 ** 콘텐츠 만 '-1'인 태그도 삭제합니다. –

+0

분명히'cEAN'과'UCOm'을 제거 할 것입니다. 속성이없고 자식 노드가없고 텍스트도 없습니다.따라서 'and'조건의 세 가지 조건이 모두 참이면 일치합니다. 아마도 그 표현의 논리를 검토하면됩니다. – Flynn1179

+0

XSL에 새로 온 것입니다. 을 제외한 모든 빈 태그를 제거하고 싶습니다. 어떻게 할 수 있는지 알고 계십니까? –

답변

0

먼저 XML을 수정해야 유효합니다.은 </cEAN>에 해당하는 시작 태그가 표시되지 않기를 바랍니다. xsl:preserve-space 요소에 @priority을 사용할 수 없습니다.

제 가정이 맞으면 예상되는 동작입니다. 다음과 같은 요소는 cEAN에 값이있는 텍스트 노드가 공백 ()임을 의미합니다.

<cEAN> </cEAN> 

그리고

<cEAN/> 

는 요소 cEAN 그것에 널 값 (텍스트 노드 자식 요소)를 갖는 것을 의미한다. <cEAN/><cEAN></cEAN>과 동일합니다.

스타일 시트의 템플릿 :

<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/> 

일치 <cEAN/> 따라서는 템플릿이 아무것도하지 않는로 출력 생략한다. 출력이 될 것

<NFe> 
    <cEAN/> 
    <CFOP>9999</CFOP> 
    <empty/> 
</NFe> 

:

<?xml version="1.0" encoding="utf-8"?> 
<NFe> 
    <cEAN/> 
    <CFOP>9999</CFOP> 
</NFe> 
귀하의 의견은 XML 다음과 같은 경우

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="*[. = '' and not(self::cEAN)]"/> 
</xsl:stylesheet> 

:

것은 cEAN 요소를 제외한 모든 빈 요소를 제거하려면 다음 스타일 시트를 사용할 수 있습니다

+0

안녕하세요. 먼저 답변에 감사드립니다. \t XSL에 새로운 기능이 있습니다. 빈 태그는 모두 제거하고 싶지만, 태그는 예외입니다. 어떻게 할 수 있는지 알고 계십니까? - –

+0

@EduardoOliveira, 제 편집 된 답변을 참조하십시오. –

+0

작품입니다. 매우 감사합니다, –

관련 문제