首页 > 解决方案 > XSLT 未声明的实体。现在给出编译错误,但它曾经工作

问题描述

简短的摘要

当实际使用 !ENTITY 声明时,我们的 XSLT 样式表无法编译。说“对未声明实体的引用”。

我可以保留声明,并注释掉对该声明的实际调用,一切正常。

奇怪的是,这个相同的过程在过去 10 年中运行良好......并且最近在 2 个月前被使用,没有任何已知的修改。

试图调试十年没有修改过的遗留代码,而我对 XSLT 的理解为零......


所有多汁的细节

下图 1 中transform.Load函数调用 (XslCompiledTransform.Load)失败。

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]..

标签: .netxmlxslt

解决方案


之后!ENTITY应该是实体名称(在您的情况下cr),然后是字符代码。

据我了解,应该有回车字符的代码,即13(十进制)。

所以有问题的片段应该是:

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

在我看来,"<xsl:text> </xsl:text>"这是不寻常的,因为在 XSLT 代码的其他地方它意味着一个空格


推荐阅读