.net - 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]..
解决方案
之后!ENTITY
应该是实体名称(在您的情况下cr
),然后是字符代码。
据我了解,应该有回车字符的代码,即13(十进制)。
所以有问题的片段应该是:
<!DOCTYPE xsl:stylesheet [
<!ENTITY cr " ">
]>
在我看来,"<xsl:text> </xsl:text>"
这是不寻常的,因为在 XSLT 代码的其他地方它意味着一个空格。
推荐阅读
- amazon-web-services - vpc“X”中的lamda可以访问vpc“y”中的efs吗
- ruby - 如何修补此 Ruby 模块以避免代码重复?
- service-worker - 将 gzip 压缩数据保存到 service worker 的缓存存储中
- python - psycopg2:用一个查询更新多行
- url - 标题标签更改为 URL
- jenkins - 获取变量的声纳分析状态(GUI 作业)
- linux - 对同一文件进行并发读取时的 Linux 预读
- sql - 如何确定oracle中的集合或记录/行占用的表的大小
- azure - Azure IoT Hub 消息路由路由查询,仅识别所需属性的更改
- shell - 根据字段数量添加额外的字符串 - Sed/Awk