XSLT Undeclared实体。现在给出编译错误,但它曾经工作

问题描述 投票:1回答:1

简短的摘要

实际使用!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]..
.net xml xslt
1个回答
0
投票

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

据我所知,应该有Carriage Return char的代码,即13(十进制)。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.