尝试使用Grails进行一些转换,并想知道引用问题。 我已经在“/WEB-INF/xslt/{file}.xsl”下托管了模板,我注意到文件有对其他文件的导入引用 类似的东西:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i18n="http://apache.org/cocoon/i18n/2.1">
<xsl:import href="file2.xsl"/>
<xsl:import href="../xslt/file2.xsl"/>
我知道这不是正确的引用这一事实,我想知道如何在需要转换时引用要导入的主xsl文件中的xsl资源。
我正在通过以下代码处理它们:
def String resources = grailsApplication.mainContext.getResource('/WEB-INF/xslt/'+xslTemplateName).file
def String xslt = new File(resources).text
def factory = TransformerFactory.newInstance()
def transformer = factory.newTransformer(new StreamSource(new StringReader(xslt)))
答案 0 :(得分:1)
在导入中使用相对URI没有任何问题,问题是通过自己加载XSLT文件的内容然后从Transformer
创建new StreamSource(Reader)
,Transformer
已经不知道从中加载的URL,因此无法正确解析相对URI。相反,您应该使用带StreamSource
的{{1}}构造函数之一,例如
systemId
另请注意,您应该让def xslResource = grailsApplication.mainContext.getResource(
'/WEB-INF/xslt/'+xslTemplateName)
StreamSource xslSource = new StreamSource(xslResource.getInputStream(),
xslResource.getURL().toString())
Transformer transformer = factory.newTransformer(xslSource)
直接读取资源的TransformerFactory
,以便XML解析器可以检测并使用正确的字符编码来加载文件。执行InputStream
时,它始终使用当前平台的默认编码,这可能与File.text
声明给出的文件编码不同。