忽略 doctype DTD 但将其保留在转换后的 XML C# 中
Ignore doctype DTD but keep it in the transformed XML C#
我需要转换 XML 文件,该文件在 header 中具有此文档类型:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOC SYSTEM "ts.dtd">
<?xml-stylesheet type="text/css" href="ts.css"?>
转换很顺利,但是 XSL 转换后文档类型消失了,我已经尝试了 XmlReaderSettings
上的各种设置,但无法正常工作。
这是我的代码:
XslCompiledTransform xctTransformer = new XslCompiledTransform();
xctTransformer.Load(fiXSL.FullName);
XmlReaderSettings xrsReaderSettings = new XmlReaderSettings();
xrsReaderSettings.ConformanceLevel = ConformanceLevel.Document;
xrsReaderSettings.DtdProcessing = DtdProcessing.Ignore;
xrsReaderSettings.XmlResolver = null;
xrsReaderSettings.CloseInput = true;
xrsReaderSettings.IgnoreWhitespace = false;
XmlWriterSettings xwsWriterSettings = new XmlWriterSettings();
xwsWriterSettings.Indent = true;
XmlReader xrReader = XmlReader.Create(fiXML.FullName, xrsReaderSettings);
XmlWriter xwWriter = XmlWriter.Create(fiXML.FullName.Substring(0, fiXML.FullName.Length - 4) + "_TRANS.xml", xwsWriterSettings);
// Transform the XML using the XSL
xctTransformer.Transform(xrReader, xwWriter);
xctTransformer = null;
// Close reader + writer
xrReader.Close();
xwWriter.Close();
DOCTYPE 节点不是 XSLT/XPath 数据模型的一部分,因此您无法使用 XSLT 处理和复制它。如果您希望您的最终结果具有特定的 DOCTYPE 声明,那么使用 XSLT 的唯一方法是确保您的样式表中有一个带有 doctype-system="ts.dtd"
.
的 xsl:output
我刚刚发现的另一个答案是通过 XSL 以文本方式添加它:
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE DOC SYSTEM "ts.dtd"></xsl:text>
<xsl:copy>
<xsl:apply-templates select = "*|@*|comment()|processing-instruction()|text()"/>
</xsl:copy>
</xsl:template>
我需要转换 XML 文件,该文件在 header 中具有此文档类型:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE DOC SYSTEM "ts.dtd">
<?xml-stylesheet type="text/css" href="ts.css"?>
转换很顺利,但是 XSL 转换后文档类型消失了,我已经尝试了 XmlReaderSettings
上的各种设置,但无法正常工作。
这是我的代码:
XslCompiledTransform xctTransformer = new XslCompiledTransform();
xctTransformer.Load(fiXSL.FullName);
XmlReaderSettings xrsReaderSettings = new XmlReaderSettings();
xrsReaderSettings.ConformanceLevel = ConformanceLevel.Document;
xrsReaderSettings.DtdProcessing = DtdProcessing.Ignore;
xrsReaderSettings.XmlResolver = null;
xrsReaderSettings.CloseInput = true;
xrsReaderSettings.IgnoreWhitespace = false;
XmlWriterSettings xwsWriterSettings = new XmlWriterSettings();
xwsWriterSettings.Indent = true;
XmlReader xrReader = XmlReader.Create(fiXML.FullName, xrsReaderSettings);
XmlWriter xwWriter = XmlWriter.Create(fiXML.FullName.Substring(0, fiXML.FullName.Length - 4) + "_TRANS.xml", xwsWriterSettings);
// Transform the XML using the XSL
xctTransformer.Transform(xrReader, xwWriter);
xctTransformer = null;
// Close reader + writer
xrReader.Close();
xwWriter.Close();
DOCTYPE 节点不是 XSLT/XPath 数据模型的一部分,因此您无法使用 XSLT 处理和复制它。如果您希望您的最终结果具有特定的 DOCTYPE 声明,那么使用 XSLT 的唯一方法是确保您的样式表中有一个带有 doctype-system="ts.dtd"
.
xsl:output
我刚刚发现的另一个答案是通过 XSL 以文本方式添加它:
<xsl:template match="/">
<xsl:text disable-output-escaping='yes'><!DOCTYPE DOC SYSTEM "ts.dtd"></xsl:text>
<xsl:copy>
<xsl:apply-templates select = "*|@*|comment()|processing-instruction()|text()"/>
</xsl:copy>
</xsl:template>