有一个包含以下内容的XSL文件:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:XQHeaderFunc="java:com.sonicsw.xq.service.xform.HeaderExtension"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="XQHeaderFunc saxon">
<saxon:script language="java" implements-prefix="XQHeaderFunc" src="java:com.sonicsw.xq.service.xform.HeaderExtension" />
后来在文件中:
<xsl:variable name="processId" select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
当我尝试进行转换时,我收到此错误:
找不到与命名空间'java:com.sonicsw.xq.service.xform.HeaderExtension'关联的脚本或扩展对象。
这是一些我不关心的SonicMQ特定内容。有什么方法可以忽略它吗?
我目前正在进行这样的转型:
var readerSettings = new XmlReaderSettings
{
ConformanceLevel = ConformanceLevel.Document,
IgnoreWhitespace = true,
IgnoreComments = true,
IgnoreProcessingInstructions = true,
CheckCharacters = true,
};
var writerSettings = new XmlWriterSettings
{
Encoding = Encoding.UTF8,
ConformanceLevel = ConformanceLevel.Document,
NewLineHandling = NewLineHandling.Replace,
OmitXmlDeclaration = false,
NewLineChars = "\r\n",
Indent = true,
IndentChars = " ",
CloseOutput = false,
};
var xsl = new XslCompiledTransform(System.Diagnostics.Debugger.IsAttached);
using (var stylesheet = XmlReader.Create(xslFile, readerSettings))
xsl.Load(stylesheet);
using (var result = new MemoryStream())
{
using (var xml = XmlReader.Create(xmlFile, readerSettings))
using (var xmlWriter = XmlWriter.Create(result, writerSettings))
{
xsl.Transform(xml, xmlWriter);
}
// Deal with result
}
答案 0 :(得分:0)
是动态提供的XSLT文件还是可以手动修改的单个文件?
如果是后者,您可以使用它来防止自定义函数导致错误:
<xsl:variable name="processId">
<xsl:if test="function-available('XQHeaderFunc:getProperty') and function-available('XQHeaderFunc:new)">
<xsl:value-of select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
</xsl:if>
</xsl:variable>
如果函数不可用,这将导致processId为空。要替换默认值,您可以执行此操作
<xsl:variable name="processId">
<xsl:choose>
<xsl:when test="function-available('XQHeaderFunc:getProperty') and function-available('XQHeaderFunc:new)">
<xsl:value-of select="XQHeaderFunc:getProperty(XQHeaderFunc:new(),'processId',-1)" />
</xsl:when>
<xsl:otherwise>
Default Value
</xsl:otherwise>
</xsl:choose>
</xsl:variable>