2009-02-16 30 views
7

Khi cố gắng xuất một phần tử văn bản trống, bộ xử lý .NET XSLT thu gọn phần tử thành dạng ngắn của nó. Thay vì điều này:Sử dụng XSLT để xuất một phần tử văn bản HTML trống

<textarea id="blah" name="blah"></textarea> 

tôi có được điều này:

<textarea id="blah" name="blah"/> 

nào gây ra nhiều trình duyệt web (bao gồm cả IE và Firefox) để làm cho phần còn lại của trang như thể nó là nội dung của textarea. Điều này thật tệ.

Tôi có thể buộc bộ xử lý XSLT xuất cả thẻ văn bản mở và đóng nếu tôi đặt thứ gì đó ở giữa như không gian không phá vỡ. Nhưng điều đó có nghĩa là tôi phải thực hiện phân tích cú pháp và xác thực hơn ở phía máy khách để biết khi nào vùng văn bản là "thật" trống. Tôi cũng phải sử dụng JavaScript để xóa không gian thừa để người dùng không bắt đầu nhận xét của họ bằng khoảng trống.

Có ai biết cách buộc bộ xử lý XSLT hiển thị cả thẻ mở và đóng mà không cần phải chèn nội dung giả không?

Trả lời

3

Tìm câu trả lời của bạn thông qua một câu hỏi tương tự ngay here trên Stackoverflow.com :-)

Here được giải thích thêm từ MSDN.

2

Tôi phải sử dụng nội dung giả, đây là mẫu xsl: tôi đã sử dụng, chỉ có ký tự Dòng nguồn bên trong vùng văn bản.

<!-- This prevents empty textarea elements being rendered as singletons in the XHTML output by adding a newline character --> 
<xsl:template name="xhtml-textarea-contents"> 
    <!-- what should be contained in the textarea --> 
    <xsl:param name="contents" /> 

    <xsl:choose> 
     <xsl:when test="$contents = ''"><xsl:text>&#x0A;</xsl:text></xsl:when> 
     <xsl:otherwise><xsl:copy-of select="$contents" /></xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

đây là điều duy nhất làm việc cho tôi, cảm ơn! – travis

1

Chris Ballance có câu trả lời phù hợp với tôi. Nhưng đó là đáng chú ý mà tôi đã sử dụng một quá tải của XslCompiledTransform rằng sản lượng để một dòng suối, như vậy:

XslCompiledTransform transform = new XslCompiledTransform(); 
... 
MemoryStream stream = new MemoryStream(); 
transform.Transform(reader, args, stream); 

Để vượt qua các cài đặt chính xác cùng, tôi đã phải sử dụng quá tải mà chấp nhận một XmlWriter để thay thế.

// using XmlWriter so I can pass the output settings along. 
XmlWriter writer = XmlWriter.Create(stream, transform.OutputSettings); 
transform.Transform(reader, args, writer); 

Microsoft sử dụng mẫu thiết kế thực sự kỳ lạ ở đó.

0

Tôi đã gặp sự cố tương tự và chỉ nhận ra rằng nếu bạn đặt ConformanceLevel của XmlWriterSettings thành Fragment, nó sẽ loại bỏ một số quirks XslCompiledTransform.

FileStream xmlFileStream = File.Create("file.xml"); 
XslCompiledTransform transform = new XslCompiledTransform(); 
transform.Load("transform.xsl"); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.ConformanceLevel = ConformanceLevel.Fragment; 
XmlWriter xmlWriter = XmlWriter.Create(xmlFileStream, settings); 
transform.Transform(sourceXml, null, xmlWriter); 
1

Nếu bạn đang tạo xml hoặc html, bạn có thể viết dòng mới bên trong vùng văn bản và sau đó xóa nó bằng jquery.

Đây là một ví dụ với jQuery:

<textarea>&#160;<textarea> 

<script> 
$(document).ready(function(){ 
    $('textarea').each(
     function(index){$(this).text('');} 
    ); 
    }); 
</script> 
1

Tôi đã gặp vấn đề này ngoài .net, đó là tái sản xuất [đối với tôi] trong cả <xsl:output method="xml"><xsl:output method="xhtml"> (Tôi đang làm cho một giả định rằng method="html" không áp dụng kịch bản của chúng tôi nơi đầu ra phải là tốt được hình thành xml)

để tránh thẻ textarea từ sụp đổ, chúng ta phải chèn một số nội dung vào nó, nhưng chúng ta cũng phải tránh làm xáo trộn thực tế nội dung.Sau đây:

<xsl:if test="not(normalize-space())"><xsl:comment></xsl:comment></xsl:if> 

tạo kết quả chính xác (ví dụ: ngăn trống textarea khỏi tự đóng và không giới thiệu nội dung nhân tạo). Tôi tin rằng hành vi này được đề cập trong thông số kỹ thuật theo node construction from post-schema-validation infoset, trong đó giá trị chuỗi bình luận trống sẽ trở thành chuỗi có độ dài bằng không; Tuy nhiên, cách viết của tài liệu là waaay quá w3-ey để đọc buổi chiều.

Đẩy nó một chút nữa (vì vậy nếu nó không làm xáo trộn nội dung, làm chúng tôi thực sự cần xsl:if?), đây là mẫu thức có thể ngăn chặn một số thẻ từ sụp đổ (Tôi mong muốn làm theo mô hình identity transform) :

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

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

NB: hành vi của trình duyệt sẽ đề xuất chuyển đổi này cũng nên được áp dụng cho một số yếu tố khác, như đoạn văn. Tuy nhiên, việc tự đóng cửa <p/> không phải là phá hoại vì có tự đóng cửa <textarea/>!

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