防止XslCompiledTransform使用自闭合标签

8
我正在使用XslCompiledTransform将XML文件转换为HTML。有没有办法防止它使用自封闭标记。
例如:
<span></span> <!-- I want this even if content empty -->
<span/> <!-- stop doing this! ->
标签中的自闭合标签会影响我的文档,不管我使用哪个浏览器,尽管它是有效的XML,但是“span”不允许具有自闭合标签。

是否可以在我的xsl或C#.Net代码中设置以防止使用自闭合标签?


一个没有属性或内容的span应该完全不可见。将您的span包装在xsl:if块中以检查内容是否适用于您? - Karmic Coder
正确的术语是自闭合标签。 - Max Toro
好问题,+1。请看我的答案,有两个替代方案。 - Dimitre Novatchev
4个回答

2

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

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

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

但通常情况下,您只需将其转换为流或TextWriter即可。在这种情况下,C#代码中不需要执行任何操作以遵守样式表中的输出方法。


0

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

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


2
即使采用输出方法为“html”,仍会生成无效的<span/>。 - Sheamus
@Sheamus:那么你一定需要修改XmlWriter的设置和/或编写实现XmlWriter的类,就像我在我的答案中建议的那样。 - Dimitre Novatchev

0
我找到的唯一解决方案是在XSL文件中添加逻辑。基本上,如果我想要包装的元素为空,则根本不使用span元素。
<xsl:if test="count(jar/beans) > 0">
   <xsl:apply-templates select="jar/beans"/>
</xsl:if>

在我的xsl文件中到处插入这个并不理想,因为即使我选择输出方法“html”,它也会很愿意生成非法的HTML。

唉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接