2011-08-22 33 views
6

Tôi đang sử dụng XslCompiledTransform để chuyển đổi tệp XML thành HTML. Có cách nào tôi có thể ngăn chặn nó bằng cách sử dụng thẻ tự đóng.Ngăn XslCompiledTransform sử dụng thẻ tự đóng

ví dụ:

<span></span> <!-- I want this even if content empty --> 
<span/> <!-- stop doing this! -> 

Thẻ tự đóng trên span đang làm rối tung tài liệu của tôi bất kể trình duyệt nào tôi sử dụng, dù đó là XML hợp lệ, chỉ là 'span' không được phép có thẻ tự đóng.

Có cài đặt nào tôi có thể đặt vào xsl hoặc trong mã C# .Net để ngăn các thẻ tự đóng không được sử dụng không?

+0

Một khoảng không có thuộc tính hoặc nội dung phải hoàn toàn ẩn. Sẽ gói khoảng của bạn trong một khối xsl: if để kiểm tra xem nội dung có hiệu quả với bạn không? –

+0

Thuật ngữ chính xác là các thẻ tự đóng. –

+0

Câu hỏi hay, +1. Xem câu trả lời của tôi cho hai giải pháp thay thế. –

Trả lời

0

Bạn có thể thử <xsl:output method="html"/>, tuy nhiên kết quả sẽ không còn là tài liệu XML được định dạng tốt nữa.

Hoặc, bạn có thể gọi XslCompiledTransform.Transform() phương pháp qua là một trong những thông số của riêng bạn XmlWriter. Trong thực hiện của bạn, bạn có toàn quyền kiểm soát và có thể thực hiện bất kỳ yêu cầu serialization của cây kết quả.

+1

Điều này vẫn tạo ra không hợp lệ, ngay cả với phương thức đầu ra = "html". – Sheamus

+0

@Sheamus: Sau đó, bạn chắc chắn phải sửa đổi các thiết lập cho XmlWriter của bạn và/hoặc viết lớp của bạn thực hiện XmlWriter, như tôi đề nghị trong câu trả lời của tôi .. –

0

Trong việc sử dụng XSLT của bạn <xsl:output method="html"/> và sau đó đảm bảo các yếu tố kết quả HTML mà bảng định kiểu của bạn tạo ra không có không gian tên. Hơn nữa tùy thuộc vào cách bạn sử dụng XslCompiledTransform trong mã C# của bạn, bạn cần phải đảm bảo rằng các thiết đặt xsl:output trong biểu định kiểu được vinh danh. Bạn có thể dễ dàng đạt được điều đó bằng cách chuyển đổi sang một tệp hoặc luồng hoặc TextWriter, trong trường hợp đó không có gì phải được thực hiện. Tuy nhiên, nếu bạn vì một số lý do chuyển đổi thành XmlWriter thì bạn cần đảm bảo nó được tạo với các cài đặt thích hợp, ví dụ:

XslCompiledTransform proc = new XslCompiledTransform(); 
proc.Load("sheet.xsl"); 

using (XmlWriter xw = XmlWriter.Create("result.html", proc.OutputSettings)) 
{ 
    proc.Transform("input.xml", null, xw); 
} 

Nhưng thông thường bạn sẽ ổn khi chỉ cần chuyển sang luồng hoặc TextWriter, trong trường hợp đó không có gì trong mã C# phải được thực hiện để tôn trọng phương thức đầu ra trong biểu định kiểu.

+2

vẫn được tạo. – Sheamus

0

Giải pháp duy nhất tôi có thể tìm thấy, là thêm logic vào tệp XSL. Về cơ bản, nếu các yếu tố tôi muốn quấn xung quanh là trống rỗng, không sử dụng các yếu tố span ở tất cả.

<xsl:if test="count(jar/beans) > 0"> 
    <xsl:apply-templates select="jar/beans"/> 
</xsl:if> 

Không lý tưởng để phải chèn này ở khắp mọi nơi trong file xsl tôi, để bù đắp cho sự thật rằng mặc dù tôi chọn ra phương pháp "html", nó hơn nguyện sẽ tạo ra HTML bất hợp pháp.

Sigh.

1

Mặc dù tôi không thể phân loại này là giải pháp trực tiếp (vì nó không phát ra phần tử trống), cách khắc phục mà tôi sử dụng là đặt khoảng trắng (sử dụng xsl: text) trong phần tử - vì đây là Đánh dấu HTML và nếu bạn đang kích hoạt chế độ Chuẩn (không phải là quirks), khoảng trống thừa sẽ không thay đổi nội dung được hiển thị. Tôi cũng không kiểm soát được sự kêu gọi của đối tượng biến đổi.

<div class="clearBoth"><xsl:text> </xsl:text></div> 
Các vấn đề liên quan