0

尝试使用 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)))
4

1 回答 1

1

在导入中使用相对 URI 没有任何问题,问题是通过自己加载 XSLT 文件的内容然后创建Transformerfrom a new StreamSource(Reader)Transformer不知道加载它的 URL,因此无法解决相对URI 正确。相反,您应该使用StreamSource带 a 的构造函数之一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资源直接读取,InputStream以便 XML 解析器可以检测并使用正确的字符编码来加载文件。当你这样做时File.text,它总是使用当前平台的默认编码,这可能与<?xml?>声明中给出的文件编码不同。

于 2013-07-29T13:52:00.830 回答