2009-07-15 4 views
4

들어오는 모든 요청을 가로 채서 응답 XML에 공백을 제거하고 결과에 '깨끗한'XML을 쓰려고하는 응용 프로그램에 서블릿 필터가 있습니다. . 나는 이것을 달성하기 위해 XSLT를 사용하고있다. 아래 XSLT를 참조하십시오.XSLT : <xsl : strip-space>가 작동하지 않습니다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 

<xsl:output method="xml" omit-xml-declaration="no" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="@*|node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

그러나 예상대로 작동하지 않습니다. 결과 XML은 (원래 XML과 동일에도 불구하고 < XSL 사용 :. 스트립 공간 요소 = "*"/> 스타일 시트에서

날이 권리를 얻는 도와주세요

감사를
. - 인 Ashish

당신이 출력으로 얻을하려는 것을, 그리고 당신이 처음에 xsl:strip-whitespace 기대하지만주의해야 할 한 가지가 있지만, 모든 공백을 제거하지 않는 것이 무엇인지 분명하지 않다

답변

14

:로 가정하면

뜻 "즉시 연 후 및 태그를 닫기 전에 모든 공백을 제거" "트림"을 선택한 후 다음과 같은 추가 템플릿 규칙은 트릭을 할해야 , <xsl:template match="text()"><xsl:value-of select="normalize-space(.)"/></xsl:template> 트릭을해야합니다.

17

. "일반적인"규칙에 따라 중요하지 않은 것으로 간주됩니다. 특히 XSLT 1.0 사양에서 :

공백 문자 만 포함되지 않는 한 텍스트 노드는 절대로 제거되지 않습니다. 이 <foo><bar> 전에 3 공백 전용 텍스트 노드 (있었기 때문에 사이

<foo><bar/></foo> 

:

따라서, 예를 들어,이 :

<foo> 
    <bar> </bar> 
</foo> 

는 아래로 제거됩니다 <bar></bar></bar> 이후 및 </foo> 이전). 출력에

<foo> 
    <bar/> 
<foo> 

: 당신이 당신의 스타일에 <xsl:output indent="yes">을 가지고 있기 때문에, 그것은 끝날 것 또한

참고로 변환된다. 한편

이 : 포함 된 모든 텍스트 노드가 순수 공백 노드하지 않기 때문에

<foo> 
    text1 
    <bar> text2 </bar> 
    text3 
</foo> 

이 전혀 제거되지 않습니다.

+1

그런 정교한 설명 파벨에 감사드립니다. 사실 기능에 대한 나의 이해가 잘못되었습니다. 이제 이것이 가능하지 않기 때문에 XSLT 스타일 시트를 사용하여 모든 텍스트 노드의 값을 '트림'하는 방법이 있습니까? – Vini

+0

@Winnie - 복사 된 노드에서 텍스트를 트리밍하는 해결책을 찾았습니까? –

+1

@MattHuggins 두 번째 대답을 보셨습니까? –

2

두 번째 답변으로 추가하십시오. 첫 번째 설명의 설명은 계속 유지하기에 충분하므로 (희망 사항) 유용하기 때문입니다. 원래의 질문에서 XSLT를 사용

<xsl:variable name="whitespace">&#x20;&#x9;&#xD;&#xA;</xsl:variable> 

<!-- Trim all whitespace at beginning of string --> 
<xsl:template name="trim-start"> 
    <xsl:param name="text"/> 
    <xsl:variable name="first-char" select="substring($text, 1, 1)" /> 
    <xsl:choose> 
    <xsl:when test="contains($whitespace, $first-char)"> 
     <xsl:call-template name="trim-start"> 
     <xsl:with-param name="text" select="substring($text, 2)" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<!-- Trim all whitespace at end of string --> 
<xsl:template name="trim-end"> 
    <xsl:param name="text"/> 
    <xsl:variable name="last-char" select="substring($text, string-length($text), 1)" /> 
    <xsl:choose> 
    <xsl:when test="contains($whitespace, $last-char)"> 
     <xsl:call-template name="trim-end"> 
     <xsl:with-param name="text" select="substring($text, 1, string-length($text) - 1)" />   </xsl:call-template> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:call-template name="trim-start"> 
    <xsl:with-param name="text"> 
     <xsl:call-template name="trim-end"> 
     <xsl:with-param name="text" select="."> 
     </xsl:call-template> 
    <xsl:param> 
    </xsl:call-template> 
</xsl:template> 
+0

예, 모든 공간을 다듬어야합니다. 도와주세요. – Vini

+0

업데이트 된 버전을 사용해보십시오. –

관련 문제