我正在使用一个使用“xsl method:xml”的网站来创建html模板。但是,当xsl引擎呈现html页面时,我遇到了标签自动关闭的问题。
<div></div>
转换为=&gt; <div/>
这个问题因为该方法需要保留xml,或者页面的其他组件无法正确呈现而更加复杂。
有关如何告诉xsl为节点<div>
制作特殊例外的任何想法?
这个问题类似于这个问题,除了我想保留方法:xml。 XSLT self-closing tags issue
答案 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());