【问题标题】:Prevent XslCompiledTransform from using self-closing tags防止 XslCompiledTransform 使用自闭合标签
【发布时间】:2011-08-22 21:40:37
【问题描述】:

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

例如

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

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

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

【问题讨论】:

  • 没有属性或内容的 span 应该是完全不可见的。将您的跨度包装在 xsl:if 块中以检查内容是否适合您?
  • 正确的术语是自闭标签。
  • 好问题,+1。请参阅我的答案以了解两种替代解决方案。

标签: c# .net xslt html shorttags


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以尝试&lt;xsl:output method="html"/&gt;但是结果将不再是格式正确的 XML 文档。

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

    【讨论】:

    • 这仍然会生成无效的,即使输出方法=“html”。
    • @Sheamus:那么您肯定必须修改 XmlWriter 的设置和/或编写实现 XmlWriter 的类,正如我在回答中所建议的那样。
    【解决方案3】:

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

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

    必须在我的 xsl 文件中的任何地方插入它并不理想,以补偿即使我选择输出方法“html”,它也会很乐意生成非法 HTML。

    叹息。

    【讨论】:

      【解决方案4】:

      在您的 XSLT 中使用 &lt;xsl:output method="html"/&gt;,然后确保您的样式表创建的 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# 代码中执行任何操作来支持样式表中的输出方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 2013-11-06
        相关资源
        最近更新 更多