2013-05-15 6 views
9

동일한 XML 시트를 어떻게 만들 수 있습니까? 각 속성의 선행 공백과 후행 공백을 제거하려면 어떻게해야합니까? 나는 내가 normalize-space() 기능을 사용하는 것을 선호 거라고 생각XSLT 모든 속성의 선행 및 후행 공백 제거

<node id="DSN"> 
    <event id="2190"> 
     <attribute key="Teardown"/> 
     <attribute key="Resource"/> 
    </event> 
</node> 

하지만, 어떤 작동합니다

<node id="DSN "> 
    <event id=" 2190 "> 
     <attribute key=" Teardown"/> 
     <attribute key="Resource "/> 
    </event> 
</node> 

이 사람 :이에서

이동 (XSLT 2.0을 사용).

+0

smaccoun는 현재 허용 대답이 잘못 양해하여 주시기 바랍니다. 요청 된 것 이상을 수행하며 앞뒤 공백을 제거 할뿐만 아니라 모든 공백을 하나의 공백으로 줄입니다. @Gunther는 좋은 XSLT 2.0 솔루션을 제공했으며, 이는이 질문에서 정확히 원하는 것을 수행합니다. 정답을 수락하는 것이 좋습니다. –

+0

감사 ... – smaccoun

+0

좋습니다. 진실은 항상 최후에 이깁니다. –

답변

16

normalize-space()은 앞뒤 공백을 제거 할뿐만 아니라 연속 공백 문자 시퀀스 대신 공백 문자 하나를 설치합니다.

정규 표현식

단지 맨 앞과 맨 뒤의 공백을 처리하는 데 사용할 수 있습니다

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

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

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}" namespace="{namespace-uri()}"> 
     <xsl:value-of select="replace(., '^\s+|\s+$', '')"/> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 
+1

+1 만 정답을 게시합니다. –

+1

@DimitreNovatchev, 잠깐, 또? :-D –

+0

@JonL., 왜 "다시"? 이것은 거의 1 년 전이었습니다. :) –

7

이 그것을 수행해야합니다

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

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

    <xsl:template match="@*"> 
    <xsl:attribute name="{name()}"> 
     <xsl:value-of select="normalize-space()"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

이것은 또한 XSLT 1.0 호환됩니다. 여기에서 주목해야 할

<node id="DSN"> 
    <event id="2190"> 
    <attribute key="Teardown" /> 
    <attribute key="Resource" /> 
    </event> 
</node> 

한 가지 normalize-space()이 하나의 공간으로 속성 값에서 공백을 설정하는 것입니다, 그래서이 : 샘플 입력에서 실행

, 결과는

<element attr=" this is an 
        attribute " /> 

이 변경 될 :

<element attr="this is an attribute" /> 

것은 당신이 w를 유지해야하는 경우 hitespace 값 그대로, 다음 Gunther의 대답을 참조하십시오.

+0

-1 잘못된 대답입니다. 문제는 앞과 뒤의 공백을 없애고 닫힌 공백을 하나의 공백으로 표준화하지 않기위한 * only *입니다. –

+0

@DimitreNovatchev 질문 전체를 읽었을 때, 묻는 사람이 "normalize-space() 함수를 사용하는 것이 좋겠지 만 작동하는 것은 무엇이든간에"라고 말했을 것입니다. – JLRishe

+0

JLRishe, 이것은 질문의 표현 된 목표와 모순됩니다. OP는 'normalize-space()'가하는 일을 잘 모른다. –