2009-02-16 25 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/>那样具有破坏性!