Краткое резюме
Наша таблица стилей XSLT не компилируется, когда фактически используются объявления! ENTITY. Говоря «Ссылка на необъявленную сущность».
Я могу оставить декларацию на месте и закомментировать фактический вызов этой декларации, и все работает нормально.
Что странно, этот тот же самый процесс работал нормально в течение последних 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]..