xsl方法中的自闭标签:xml

时间:2013-03-08 23:37:56

标签: xml xslt html methods

我正在使用一个使用“xsl method:xml”的网站来创建html模板。但是,当xsl引擎呈现html页面时,我遇到了标签自动关闭的问题。

<div></div>转换为=&gt; <div/>

这个问题因为该方法需要保留xml,或者页面的其他组件无法正确呈现而更加复杂。

有关如何告诉xsl为节点<div>制作特殊例外的任何想法?

这个问题类似于这个问题,除了我想保留方法:xml。 XSLT self-closing tags issue

2 个答案:

答案 0 :(得分:7)

默认情况下,method = xml不可用。您可以通过以下几种方式处理它:

选项1 - 切换到method = xhtml

如果你不能切换到method = xml,并且你正在使用XSLT 2.0解析器,也许你可以尝试method = xhtml?

<xsl:output method="xhtml" indent="yes" />

这将使您的结束标记呈现。

选项2 - 为'div'标记添加空格

或者只是添加<xsl:text> </xsl:text>(标签之间有一个空格),以使<div>不为空(当然,如果空间没有问题)。

考虑遵循XML:

<div></div>

转换为:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- output is xml -->
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="div">
    <div>
      <!-- note space here -->
      <xsl:text> </xsl:text>
      <xsl:value-of select="text()" />
    </div>
  </xsl:template>
</xsl:stylesheet>

它产生输出:

<?xml version="1.0" encoding="UTF-8"?>
<div> </div>

答案 1 :(得分:1)

我遇到了同样的问题。问题是XmlTextWriter只会弄乱html。请尝试以下代码:

public static string Transform(string xmlPath, string xslPath, XsltArgumentList xsltArgumentList)
    {
        string rc = null;
        using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
        {
            XPathDocument myXPathDoc = new XPathDocument(xmlPath);
            XslCompiledTransform myXslTrans = new XslCompiledTransform();
            myXslTrans.Load(xslPath, new XsltSettings(true, true), null);
            myXslTrans.Transform(myXPathDoc, xsltArgumentList, ms);
            ms.Position = 0;
            using (System.IO.TextReader reader = new System.IO.StreamReader(ms, Encoding.UTF8))
            {
                rc = reader.ReadToEnd();
            }
        }
        return rc;
    }

我使用XsltArgumentList将信息传递给xslt。如果您不需要将参数传递给xslt,则可以调用以下方法:

string myHtml = Transform(myXmlPath, myXslPath, new XsltArgumentList());