2009-02-16 65 views
7

當試圖輸出一個空的textarea元素時,.NET XSLT處理器將元素摺疊爲其簡寫形式。取而代之的是:使用XSLT輸出一個空的HTML textarea元素

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

我得到這個:

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

這會導致許多網絡瀏覽器(包括IE和Firefox)來渲染頁面的其餘部分,就好像它是在內容的 textarea的。 這很糟糕。

我可以強制XSLT處理器輸出打開和關閉textarea標記,如果我把東西放在一個像非破壞性的空間之間。但這意味着我必須在客戶端進行更多的解析和驗證,以確定textarea何時「真正」爲空。我還必須使用JavaScript來刪除額外的空間,以便用戶不要以空格開始他們的評論。

有誰知道強制XSLT處理器呈現打開和關閉標記而不需要必須插入虛擬內容的方法嗎?

回答

3

找到通過上Stackoverflow.com類似的問題的權利here :-)

Here你的答案是從MSDN進一步的解釋。

2

我必須使用虛擬內容,這是我使用的xsl:模板,在textarea中只有換行符。

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

這是我唯一的工作,謝謝! – travis 2010-03-31 21:54:50

1

克里斯·巴蘭斯不得不爲我工作的答案。但值得注意的是,我一直在使用XslCompiledTransform的重載輸出流,像這樣:

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

爲了一起傳遞正確的設置,我不得不使用接受一個XmlWriter的重載代替。

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

微軟在那裏使用了一個非常奇怪的設計模式。

0

我有一個類似的問題,只是意識到,如果您將XmlWriterSettings的一致性級別設置爲片段,它消除了一些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

如果你正在生成一個xml或html,你可以在textarea內寫一個換行符,然後用jquery刪除它。

這是使用jQuery的例子:

<textarea>&#160;<textarea> 

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

我已經在這兩個<xsl:output method="xml"><xsl:output method="xhtml">遇到這個問題.NET中,這是重複性的外面[我](我做一個假設,即method="html"不適用於我們的方案,其中輸出必須是格式良好的XML)

爲了避免崩潰,我們有一些內容插入到它的textarea標籤,但我們也必須避免與實際內容篡改。以下內容:

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

產生正確的結果(即防止空textarea從自閉合並且不引入人工的內容)。我相信這種行爲在node construction from post-schema-validation infoset的規範中提到,其中空註釋的字符串值將變成零長度字符串;然而,該文件的措辭是waaay太w3-ey輕午讀。

推遠一點(所以,如果它不與內容篡改,我們真的需要xsl:if),這是防止某些標籤崩潰最終模板(我向往跟隨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> 

注:瀏覽器的行爲表明這種轉換也應該應用於其他一些元素,如段落。然而,擁有自動關閉的<p/>並不像擁有自閉的<textarea/>那樣具有破壞性!