防止 XSLT 从空节点中删除结束标记
Prevent XSLT from removing end tags from empty nodes
我有这个 XSLT 样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="no" />
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html></xsl:text>
<xsl:call-template name="test" />
</xsl:template>
<xsl:template name="test">
<html>
<head>
<link rel="stylesheet" href="style.css" />
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<p>test</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
在 Visual Studio 2019 年,我尝试用 C# 编写代码并使用 XslCompiledTransform 将此样式表转换为 HTML 代码。
// XSLT settings (that turns on the usage of 'document()' directive)
XsltSettings settings = new XsltSettings(true, true);
// Instantiate the transformer (enabled debug)
XslCompiledTransform xslt = new XslCompiledTransform(true);
// Load the data from XML
XPathDocument xml_config = new XPathDocument("input.xml");
// Load XSLT stylesheet
xslt.Load("stylesheet.xslt", settings, null);
// Prepare to write output
XmlTextWriter myWriter = new XmlTextWriter("output.html", Encoding.UTF8);
// Transform XML to HTML via XSLT
xslt.Transform(xml_config, null, myWriter);
结果输出:(损坏html)
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
<script type="text/javascript" src="jquery.min.js" />
</head>
<body>
<p>test</p>
</body>
</html>
Xslt 转换器由于某种原因使标签自动关闭,从而破坏了 HTML 代码。这使得 body 和 p 标签成为脚本的子标签——因此不渲染它。
一种解决方案是将  
添加到脚本标记中,这样它就不再被视为空的,也不会自动关闭
<script type="text/javascript" src="jquery.min.js"> </script>
然而,这不是解决方案,因为并非总是可以编辑传入的 XML 文件。还有其他解决方案吗?我是否在我的 cs 源代码中遗漏了什么?还是我必须使用非默认的 XSLT 转换器?
有人建议将其放入样式表中:
<xsl:output method="html" />
但由于某些原因这不起作用
您不应使用 XmlTextWriter
作为目标,而应使用 xslt.Transform("input.xml", "output.html")
,这样 XSLT 处理器将负责序列化并可以应用您的 xsl:output
设置。
如果您确实需要 XmlWriter
作为目的地,请确保您创建一个,例如XmlWriter.Create("output.html", xslt.OutputSettings)
.
我有这个 XSLT 样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" indent="no" />
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE html></xsl:text>
<xsl:call-template name="test" />
</xsl:template>
<xsl:template name="test">
<html>
<head>
<link rel="stylesheet" href="style.css" />
<script type="text/javascript" src="jquery.min.js"></script>
</head>
<body>
<p>test</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
在 Visual Studio 2019 年,我尝试用 C# 编写代码并使用 XslCompiledTransform 将此样式表转换为 HTML 代码。
// XSLT settings (that turns on the usage of 'document()' directive)
XsltSettings settings = new XsltSettings(true, true);
// Instantiate the transformer (enabled debug)
XslCompiledTransform xslt = new XslCompiledTransform(true);
// Load the data from XML
XPathDocument xml_config = new XPathDocument("input.xml");
// Load XSLT stylesheet
xslt.Load("stylesheet.xslt", settings, null);
// Prepare to write output
XmlTextWriter myWriter = new XmlTextWriter("output.html", Encoding.UTF8);
// Transform XML to HTML via XSLT
xslt.Transform(xml_config, null, myWriter);
结果输出:(损坏html)
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="style.css" />
<script type="text/javascript" src="jquery.min.js" />
</head>
<body>
<p>test</p>
</body>
</html>
Xslt 转换器由于某种原因使标签自动关闭,从而破坏了 HTML 代码。这使得 body 和 p 标签成为脚本的子标签——因此不渲染它。
一种解决方案是将  
添加到脚本标记中,这样它就不再被视为空的,也不会自动关闭
<script type="text/javascript" src="jquery.min.js"> </script>
然而,这不是解决方案,因为并非总是可以编辑传入的 XML 文件。还有其他解决方案吗?我是否在我的 cs 源代码中遗漏了什么?还是我必须使用非默认的 XSLT 转换器?
有人建议将其放入样式表中:
<xsl:output method="html" />
但由于某些原因这不起作用
您不应使用 XmlTextWriter
作为目标,而应使用 xslt.Transform("input.xml", "output.html")
,这样 XSLT 处理器将负责序列化并可以应用您的 xsl:output
设置。
如果您确实需要 XmlWriter
作为目的地,请确保您创建一个,例如XmlWriter.Create("output.html", xslt.OutputSettings)
.