XSLT Необъявленная сущность. Сейчас выдает ошибку компиляции, но раньше работало - PullRequest
1 голос
/ 27 марта 2019

Краткое резюме

Наша таблица стилей 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]..

1 Ответ

0 голосов
/ 28 марта 2019

После !ENTITY должно быть имя объекта (в вашем случае cr), а затем код символа.

Как я понимаю, должен быть код Возврат каретки char, то есть 13 (десятичное число).

Таким образом, рассматриваемый фрагмент должен быть:

<!DOCTYPE xsl:stylesheet [
<!ENTITY cr "&#13;">
]>

На мой взгляд, "<xsl:text> </xsl:text>" является чем-то необычным, потому что в других местах в коде XSLTэто означает пробел .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...