[英]Using XSLT to output an empty HTML textarea element
尝试输出空的textarea元素时,.NET XSLT处理器将元素折叠为其简短形式。 而不是这个:
<textarea id="blah" name="blah"></textarea>
我明白了:
<textarea id="blah" name="blah"/>
这导致许多Web浏览器(包括IE和Firefox)呈现页面的其余部分,就像它是textarea的内容一样 。 这很糟糕。
我可以强制XSLT处理器输出开始和结束textarea标签,如果我在中间放置一些像不间断的空间。 但这意味着我必须在客户端进行更多的解析和验证,以告知textarea何时“真正”为空。 我还必须使用JavaScript来删除额外的空间,以便用户不用空格开始他们的注释。
有没有人知道强制XSLT处理器呈现开始和结束标签而不必插入虚拟内容的方法?
我必须使用虚拟内容,这是我使用的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>
</xsl:text></xsl:when>
<xsl:otherwise><xsl:copy-of select="$contents" /></xsl:otherwise>
</xsl:choose>
</xsl:template>
如果要生成xml或html,可以在textarea中编写换行符,然后使用jquery将其删除。
这是jQuery的一个例子:
<textarea> <textarea>
<script>
$(document).ready(function(){
$('textarea').each(
function(index){$(this).text('');}
);
});
</script>
我在.net之外遇到过这个问题,在<xsl:output method="xml">
和<xsl:output method="xhtml">
中可以重现[对我而言](我假设method="html"
不适用于我们的情况,其中输出必须是格式良好的xml)
为了避免textarea标记崩溃,我们必须在其中插入一些内容,但我们还必须避免篡改实际内容。 下列:
<xsl:if test="not(normalize-space())"><xsl:comment></xsl:comment></xsl:if>
产生正确的结果(即防止空textarea
自动关闭并且不引入人工内容)。 我相信在post-schema-validation信息集的节点构造中的规范中提到了这种行为,其中空注释的字符串值将变为零长度字符串; 然而,对于下午的轻松阅读来说,文件的措辞也是如此。
进一步推动它( 所以如果它不篡改内容,我们真的需要xsl:if
? ),这是防止某些标签崩溃的最终模板(我渴望遵循身份转换模式):
<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/>
一样具有破坏性!
Chris Ballance有一个对我有用的答案。 但值得注意的是,我一直在使用输出到流的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);
微软在那里使用了一种非常奇怪的设计模式。
我遇到了类似的问题,并且意识到如果将XmlWriterSettings的ConformanceLevel设置为Fragment,它会消除一些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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.