简短的摘要
实际使用!ENTITY声明时,我们的XSLT样式表无法编译。说'参考未申报的实体'。
我可以留下声明,并注释掉对该声明的实际调用,一切正常。
奇怪的是,这个过程在过去10年中运行良好......并且最近在2个月前使用,没有任何已知的修改。
试图调试遗留代码,这个代码已经修改了十年,而且我对XSLT没有任何理解....
所有多汁的细节
下面的transform.Load函数调用(XslCompiledTransform.Load)图1失败了。
Dim transfom As New XslCompiledTransform()
Dim readerSettings As New XmlReaderSettings()
readerSettings.DtdProcessing = DtdProcessing.Ignore
Using reader As XmlReader = XmlReader.Create(styleSheetFilePath, readerSettings)
transfom.Load(reader, XsltSettings.TrustedXslt, resolver)
End Using
它给出的错误信息是
XSLT compile error.
Reference to undeclared entity 'cr'. Line 10, position 4.
StackTrace Information
*********************************************
at System.Xml.Xsl.Xslt.XsltLoader.LoadStylesheet(XmlReader reader, Boolean include)
at System.Xml.Xsl.Xslt.XsltLoader.Load(XmlReader reader)
at System.Xml.Xsl.Xslt.XsltLoader.Load(Compiler compiler, Object stylesheet, XmlResolver xmlResolver)
at System.Xml.Xsl.Xslt.Compiler.Compile(Object stylesheet, XmlResolver xmlResolver, QilExpression& qil)
at System.Xml.Xsl.XslCompiledTransform.LoadInternal(Object stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
at System.Xml.Xsl.XslCompiledTransform.Load(XmlReader stylesheet, XsltSettings settings, XmlResolver stylesheetResolver)
当我看到正在加载的XSLT文件时,第10行...它是&cr;实体参考。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE stylesheet [
<!ENTITY cr "<xsl:text> </xsl:text>">
]>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
&cr;
<xsl:for-each select="node()">
<xsl:call-template name="RemoveEmpty" />
</xsl:for-each>
</xsl:template>
..[redacted]..
在!ENTITY
之后应该有实体名称(在你的情况下是cr
)然后是字符代码。
据我所知,应该有Carriage Return char的代码,即13(十进制)。
所以有问题的片段应该是:
<!DOCTYPE xsl:stylesheet [
<!ENTITY cr " ">
]>
在我看来,"<xsl:text> </xsl:text>"
是不寻常的,因为在XSLT代码的其他地方它意味着一个空间。