阻止XslCompiledTransform使用自关闭标记

时间:2011-08-22 21:40:38

标签: c# .net xslt html shorttags

我正在使用XslCompiledTransform将XML文件转换为HTML。有没有办法阻止它使用自闭标签。

e.g。

<span></span> <!-- I want this even if content empty -->
<span/> <!-- stop doing this! ->

无论我使用哪种浏览器,span上的自动关闭标签都会弄乱我的文档,虽然它是有效的XML,但只是'span'不允许自动关闭标签。

我可以在xsl或C#.Net代码中设置一个设置,以防止使用自动关闭标签吗?

4 个答案:

答案 0 :(得分:2)

虽然我无法将其归类为直接解决方案(因为它不会发出空元素),但我使用的解决方法是在元素中放置一个空格(使用xsl:text) - 因为这是HTML标记,如果您要激活标准模式(不是怪癖),额外的空间不会更改渲染的内容。我也无法控制变换对象的调用。

<div class="clearBoth"><xsl:text> </xsl:text></div>

答案 1 :(得分:0)

您可以尝试<xsl:output method="html"/>,但结果将不再是格式良好的XML文档。

或者,您可以调用XslCompiledTransform.Transform()方法作为您自己的 XmlWriter 参数之一传递。在您的实现中,您可以完全控制并可以实现结果树的任何所需序列化。

答案 2 :(得分:0)

在您的XSLT中使用<xsl:output method="html"/>,然后确保样式表创建的HTML结果元素没有名称空间。此外,根据您在C#代码中使用XslCompiledTransform的方式,您需要确保样式表中的xsl:output设置得到遵守。您可以通过转换为文件或流或TextWriter轻松实现这一点,在这种情况下,无需执行任何操作。但是,如果由于某些原因转换为XmlWriter,则需要确保使用适当的设置创建它,例如。

XslCompiledTransform proc = new XslCompiledTransform();
proc.Load("sheet.xsl");

using (XmlWriter xw = XmlWriter.Create("result.html", proc.OutputSettings))
{
  proc.Transform("input.xml", null, xw);
}

但通常只需转换为Stream或TextWriter就可以了,在这种情况下,必须在C#代码中没有任何内容来保证样式表中的输出方法。

答案 3 :(得分:0)

我能找到的唯一解决方案是向XSL文件添加逻辑。基本上,如果我想要包裹的元素是空的,则根本不要使用span元素。

<xsl:if test="count(jar/beans) > 0">
   <xsl:apply-templates select="jar/beans"/>
</xsl:if>

在我的xsl文件中到处都插入这个并不理想,以弥补即使我选择输出方法“html”的事实,它也不仅愿意生成非法的HTML。

叹息。