使用XSLT输出一个空的HTML textarea元素

时间:2009-02-16 02:07:39

标签: .net html xslt textarea

尝试输出空的textarea元素时,.NET XSLT处理器将元素折叠为其缩写形式。而不是:

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

我明白了:

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

这导致许多Web浏览器(包括IE和Firefox)呈现页面的其余部分,就像它是textarea的内容一样。 这很糟糕。

我可以强制XSLT处理器输出开始和结束textarea标签,如果我在它之间放置一些像不间断的空间。但这意味着我必须在客户端进行更多的解析和验证,以告知textarea何时“真正”为空。我还必须使用JavaScript来删除额外的空间,以便用户不会以空格开始他们的评论。

是否有人知道如何强制XSLT处理器呈现开始和结束标记不必插入虚拟内容?

7 个答案:

答案 0 :(得分:3)

通过Stackoverflow.com上的here类似问题找到答案: - )

Here是MSDN的进一步解释。

答案 1 :(得分: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>

答案 2 :(得分:1)

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);

微软在那里使用了一种非常奇怪的设计模式。

答案 3 :(得分:1)

如果要生成xml或html,可以在textarea中写一个换行符,然后用jquery删除它。

这是jQuery的一个例子:

<textarea>&#160;<textarea>

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

答案 4 :(得分:1)

我在.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自动关闭,并且不引入人为内容)。我相信在node construction from post-schema-validation infoset下的规范中提到了这种行为,其中空注释的字符串值将变为零长度字符串;然而,对于下午的轻松阅读,该文件的措辞也是如此。

进一步推动它(所以,如果它没有篡改内容,我们真的需要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/>

答案 5 :(得分:0)

我遇到了类似的问题,并且意识到如果将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);

答案 6 :(得分:0)

这对我有用

<xsl:template name="fillTextArea">
  <xsl:param name="sourceStr" />
    <xsl:element name="textarea">
     <xsl:attribute name="value">
       <xsl:value-of select="$sourceStr"></xsl:value-of>
         </xsl:attribute>
         <xsl:attribute name="class">notes</xsl:attribute>
     </xsl:element>
</xsl:template>