문제

나는 다음과 같은 것이 있습니다.

<node TEXT="   txt A   "/>
<node TEXT="

       txt X

"/>
<node>
   <html>
      <p>
        txt Y
      </p>
   </html>
</node>
<node TEXT="txt B"/>

그리고 나는 이것을 얻기 위해 XSLT를 사용하고 싶습니다.

txt A
txt X
txt Y
txt B

@text와 cdata의 모든 쓸모없는 공백과 라인 브레이크를 제거하고 싶습니다. 출력에 구조를 제공하는 유일한 XML 입력은 다음과 같습니다. <node>-태그.

도움이 되었습니까?

해결책

다음 변환 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
<xsl:template match="*">
  <xsl:apply-templates select="@TEXT | node()"/>
</xsl:template>

<xsl:template match="node/@TEXT | text()">
  <xsl:if test="normalize-space(.)">
    <xsl:value-of select=
     "concat(normalize-space(.), '&#xA;')"/>
  </xsl:if>

  <xsl:apply-templates />
</xsl:template>
</xsl:stylesheet>

이 XML 문서에 적용될 때

<t>
    <node TEXT="   txt A   "/>
    <node TEXT="       txt X"/>
    <node>
        <html>
            <p>        txt Y      </p>
        </html>
    </node>
    <node TEXT="txt B"/>
</t>

원하는 결과를 생성합니다.

txt a
txt x
txt y
txt b

표준 XPath 함수의 사용에 유의하십시오 정상화 공간 (), 모든 선행 및 후행 공간을 벗어나 다른 공간의 모든 시퀀스를 하나의 공간으로 대체합니다.

다른 팁

당신은 아마 원할 것입니다

 <xsl:strip-space elements="node"/>

설명했다 여기. 이 기사 더 많은 세부 사항이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top