2010-02-26 30 views
6

Tôi muốn in xml đầu ra của mình trong một dòng đơn [khi được xem trong notepad hoặc trình soạn thảo văn bản đơn giản khác], để loại bỏ khoảng trắng dư thừa trong tệp xml của tôi. Vì vậy, đó là phương pháp tốt hơn để làm theo cho rằng ??Cách tiếp cận nào tốt hơn để loại bỏ khoảng trắng dư thừa trong XML [strip-space hoặc indent = "no"]?

Tôi nghĩ có hai lựa chọn,
1) Để sử dụng

<xsl:output method="xml" indent="no"/> 

2) hoặc sử dụng

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

Đó là hiệu quả hơn, và tại sao?
một số người đề nghị tôi sử dụng indent="no",

Tôi tin rằng không gian dải phù hợp nhất, nhưng không chắc chắn vì những đề xuất do người khác đưa ra.

Để được xây dựng nhiều hơn cho tôi lấy một ví dụ:
Input XML:

<root> 
<node> 
    <child1/> 
    <child2/> 
</node> 
</root> 

và đầu ra yêu cầu là:

<root><node><child1/><child2/></node></root> 
+0

Câu hỏi hay. +1 từ tôi. Trong câu trả lời của tôi, tôi đã cố gắng giải thích hoàn toàn tác dụng của hai chỉ thị và cách chúng tương tác. –

Trả lời

10

Nhằm loại bỏ bất cứ điều gì đó trông giống như "thụt đầu dòng" nó có thể là cần thiết (có nghĩa là có những trường hợp khi bạn cần) để sử dụng cả<xsl:strip-space>'' indent = "no" `.

Lấy ví dụ đơn giản: bạn có chuyển đổi nhận dạng. Không có bất kỳ một trong hai phương thức được chỉ định, phép biến đổi sẽ tái tạo các nút văn bản chỉ trắng-không gian từ tài liệu XML nguồn. Nghĩa là, nếu tài liệu XML nguồn được thụt vào, thì phép biến đổi cũng sẽ tạo ra kết quả thụt lề.

Bây giờ, hãy thêm vào chuyển đổi này <xsl:output indent="no" />. Lệnh này hướng dẫn bộ xử lý XSLT không thực hiện "in ấn" của chính nó. Tuy nhiên, các nút chỉ khoảng trống từ tài liệu XML nguồn vẫn được sao chép vào đầu ra và tài liệu kết quả trông vẫn thụt vào (vì tài liệu nguồn được thụt vào).

Bây giờ, là bước cuối cùng, hãy thêm <xsl:strip-space elements="*"/>. Bạn đã chỉ định cả hai phương pháp ngăn chặn các nút chỉ trắng-không gian trong đầu ra. Chuyện gì xảy ra?Không có nút chỉ trắng nào được xử lý bởi bộ xử lý XSLT, nó không thụt đầu ra - bạn nhận được kết quả đầu ra dày đặc một dòng mong muốn của mình.

Cuối cùng, thực hiện hồi quy, thay đổi <xsl:output indent="no" /> thành <xsl:output indent="yes" />. Các <xsl:strip-space elements="*"/> vẫn còn đó, do đó, không có khoảng trắng chỉ có các nút được sao chép trong đầu ra. Nhưng bộ xử lý XSLT tuân theo chỉ thị <xsl:output indent="yes" /> và thêm các nút văn bản chỉ khoảng trắng riêng của nó.

Vì vậy, từ bốn tổ hợp có thể, chỉ rõ cả<xsl:strip-space elements="*"/><xsl:output indent="no" /> đảm bảo rằng không thụt đầu dòng sẽ được gây ra hoặc từ nút khoảng trắng chỉ từ nguồn tài liệu XML hoặc từ sáng kiến ​​xử lý XSLT.

Ngay cả trường hợp cuối cùng này, tất nhiên, không hoàn toàn đảm bảo rằng sản lượng sẽ không được thụt - nếu các lập trình viên XSLT cố ý đặt ở đó đang thụt đầu dòng như

<xsl:text>

</xsl:text>

đầu ra sẽ chứa thụt đầu dòng này.

+0

Cảm ơn bạn đã giải thích chi tiết :-) –

2

khác biệt Biến được đo lường tốt nhất. Việc triển khai bộ vi xử lý XSLT khác nhau, và bạn nên thực hiện kiểm tra cho chính mình (mặc dù tôi nghi ngờ rằng sự lo lắng về hiệu suất của bộ xử lý này hoặc cái kia có thể rơi vào danh mục "tối ưu hóa sớm" trong trường hợp này).

<xsl:output indent="no" /> có thể không có tác dụng bạn muốn trừ khi kèm theo

<xsl:template match="text(normalize-space()='')" /> 

bởi vì nếu các nút khoảng trắng (những giữa các thẻ của bạn) không được gỡ bỏ, sau đó họ sẽ xuất hiện trong đầu ra tại một số điểm, không phân biệt cài đặt "đầu ra".

+0

Xin lỗi vì lời bình luận trước - Tôi vẫn còn buồn ngủ - làm ơn hãy xóa nó đi. Tại sao bạn sẽ mã mẫu, khi nó có nghĩa là giống như ''? –

+0

@Dimitre: Tôi có nghĩa là nó chỉ kết hợp với '', vì 'indent =" no "' sẽ không đủ nếu không có bất kỳ khoảng trắng rõ ràng nào xử lý. Tái bút: Người duy nhất có thể xóa nhận xét của bạn là chính bạn. :-) (Tôi biết, điều này đã khác trong phiên bản đầu của trang web) – Tomalak

Các vấn đề liên quan