我正在使用XslCompiledTransform
将XML文件转换为HTML。有没有办法阻止它使用自闭标签。
e.g。
<span></span> <!-- I want this even if content empty -->
<span/> <!-- stop doing this! ->
无论我使用哪种浏览器,span上的自动关闭标签都会弄乱我的文档,虽然它是有效的XML,但只是'span'不允许自动关闭标签。
我可以在xsl或C#.Net代码中设置一个设置,以防止使用自动关闭标签吗?
答案 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。
叹息。