【问题标题】:Grails referencing of XSL Templates and TransformationXSL 模板和转换的 Grails 引用
【发布时间】:2013-07-29 13:31:57
【问题描述】:

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

【问题讨论】:

  • 您是否考虑过freemarker 而不是XSL?它有很好的XML 支持,包括xpath,你可以注入java 帮助对象和调用实用方法。我发现它比 XSL 更容易阅读和维护,而且更简洁。

标签: xslt grails


【解决方案1】:

在导入中使用相对 URI 没有任何问题,问题是通过自己加载 XSLT 文件的内容,然后从 new StreamSource(Reader) 创建 TransformerTransformer 不知道它的 URL是从中加载的,因此无法正确解析相对 URI。相反,您应该使用采用systemIdStreamSource 构造函数之一,例如

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 时,它始终使用当前平台的默认编码,这可能与&lt;?xml?&gt; 声明中给出的文件编码不同。

【讨论】:

  • 谢谢你的答案。仍然无法编译样式表但越来越接近。我注意到 URL (xslResource.getURL()) 是错误的。它实际上是 jndi:/localhost/mycontext/xslt/xsdFulltext.xsl,在这种情况下它缺少端口(8080)。
  • @Armand 您从 getResource 获得的 URL 仅用于在 Web 应用程序自己的代码中解析,它不应该是 Web 可访问的(因为通常您使用 getResource 来访问 @987654332 下的内容@,根据 servlet 规范,不得可通过网络访问)。
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2011-10-19
相关资源
最近更新 更多