2008-11-27 12 views
14

Tôi có một cái gì đó như thế này:Làm cách nào để xóa tất cả các dấu ngắt dòng?

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

     txt X 

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

và tôi muốn sử dụng XSLT để có được điều này:

txt A 
txt X 
txt Y 
txt B 

Tôi muốn gỡ bỏ tất cả khoảng trắng vô ích và xuống hàng của @ TEXT và CDATA của. Đầu vào XML duy nhất cho cấu trúc vào đầu ra là <node> -tags.

Trả lời

18

Việc chuyển đổi sau đây:

 
<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> 

khi áp dụng đối với tài liệu XML này

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

tạo ra kết quả mong muốn:

txt Một
txt X
txt Y
txt B

Do lưu ý việc sử dụng các chức năng XPath chuẩn normalize-space(), dùng để tách ra khỏi tất cả các không gian ở đầu và đuôi và thay thế tất cả các chuỗi các không gian khác chỉ với một không gian.

1

Bạn có thể muốn

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

giải thích here. Và điều này article có nhiều chi tiết hơn.

+0

Chỉ thị chỉ hoạt động đối với các nút * chỉ văn bản * * * và chắc chắn không dành cho thuộc tính. Do đó câu trả lời này không đúng. –