我正在使用XSLT将一个XML文件转换为HTML。.NET XSLT引擎不断地为空标签提供自闭合标签。
例如:
<div class="test"></div>
成为<div class="test" />
前者是有效的html,而后者是非法的html,渲染效果很差。
我的问题是:
如何告诉xslt引擎(XslCompiledTransform)不使用自闭合标签。
如果不可能,我该如何告诉我的浏览器(在这种情况下为IE6+)正确地解释自闭合标签。
我正在使用XSLT将一个XML文件转换为HTML。.NET XSLT引擎不断地为空标签提供自闭合标签。
例如:
<div class="test"></div>
成为<div class="test" />
前者是有效的html,而后者是非法的html,渲染效果很差。
我的问题是:
如何告诉xslt引擎(XslCompiledTransform)不使用自闭合标签。
如果不可能,我该如何告诉我的浏览器(在这种情况下为IE6+)正确地解释自闭合标签。
将你的xsl:output
方法更改为html
(而不是xml
)。
如果还没有该元素,则添加它。
<xsl:output method="html"/>
<script type="text/javascript" src="nowhere.js">
<xsl:comment></xsl:comment>
</script>
这不是一个优美的解决方案,但它有效 :-)
/Sten
对我来说,这是在 脚本 标签中的一个问题。我通过填充分号 (;) 解决了这个问题。
<script type="text/javascript" src="somewhere.js">;</script>
public class MyXmlTextWriter : XmlTextWriter
{
public MyXmlTextWriter(Stream stream) : base(stream, Encoding.UTF8)
{ }
public MyXmlTextWriter(TextWriter stream) : base(stream)
{ }
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
<xsl:output method="html"/>
但是,如果您的源文档有命名空间,这种方法就不起作用了。如果输出中存在命名空间节点,XSLT处理器似乎会悄悄地将输出方法更改回XML。
您需要将所有<xsl:copy-of>
和<xsl:copy>
的实例替换为仅具有本地名称的元素创建,例如:
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
请参考以下链接:
等等。
我曾经把一个<xsl:text>
元素放在里面,像这样:
<script type="text/javascript" src="/scripts/jquery.js"><xsl:text> </xsl:text></script>
您需要注意以下几点:
以下是一段可工作的代码:
string xmlStr = "<?xml version='1.0' encoding='UTF-8'?><Data></Data>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlStr);
string xslContents = @"
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:msxsl='urn:schemas-microsoft-com:xslt' exclude-result-prefixes='msxsl'>
<xsl:output method='html' version='4.0' omit-xml-declaration='yes' indent='yes'/>
<xsl:template match='Data'>
<html>
<body>
<div></div>
</body>
</html>
</xsl:template>
</xsl:stylesheet>";
XslCompiledTransform xsl = new XslCompiledTransform();
xsl.Load(XmlReader.Create(new StringReader(xslContents)));
StringWriter result = new StringWriter();
using (XmlWriter writer = XmlWriter.Create(result, xsl.OutputSettings))
{
xsl.Transform(doc, null, writer);
}
System.Diagnostics.Debug.Write( result.ToString());
刚刚遇到了与 PHP 5 的 XSL 相同的问题,输出/@method=html。似乎将空值属性分配给元素会导致元素作为无效的非自闭合、未关闭标签输出:
<input type="text" name="foo" value="{my-empty-value}" />
结果为:
<input type="text" name="foo" value="">
<xsl:if test="string-length(my-empty-value) > 0">
<xsl:attribute name="value">
<xsl:value-of select="my-empty-value" />
</xsl:attribute>
</xsl:if>
<input type="text" name="foo" />