使用scala在saxonica 9 EE上进行模式感知的XSLT转换

时间:2014-08-27 13:56:51

标签: java xml scala xslt saxon

我错过了什么?我无法理解为什么我的转换不是架构感知的。 参考:

  1. http://www.saxonica.com/documentation/schema-processing/satransformapi.html
  2. http://www.saxonica.com/documentation9.4-demo/html/changes/intro92/install92.html
  3. 我知道文档很好,xsd / xslt / xml文件由其他系统处理,并且工作正常。我试图为自己创建一个桌面命令行工具。

    源代码

    def main(args: Array[String]) 
    {
            System.setProperty(     "javax.xml.transform.TransformerFactory", "com.saxonica.config.EnterpriseTransformerFactory")
    
            val factory = new EnterpriseTransformerFactory()
            factory.setAttribute(FeatureKeys.SCHEMA_VALIDATION, new Integer(Validation.STRICT))
    
            val schemaXXX = new StreamSource( new File("PATH/to/xxx.xsd") )
            val schemaYYY = new StreamSource( new File("PATH/to/yyy.xsd") )
            factory.addSchema(schemaXXX)
            factory.addSchema(schemaYYY)
    
            val XSLT = new StreamSource(new File("PATH/to/zzz.xslt"))
            val transformer = factory.newTransformer(XSLT)
    
            val input = new StreamSource(new File("PATH/to/file.xml"))
    
            val result = new StringWriter();
            transformer.transform(input, new StreamResult(result))
    
            println(result.toString())
    }
    

    结果:

    The transformation is not schema-aware, so the source document must be untyped
    

1 个答案:

答案 0 :(得分:1)

如果Saxon-EE中的样式表明确使用xsl:import-schema,或者用于编译它的XSLT编译器明确设置为模式识别,则它被认为是模式感知的。使用s9api接口(XsltCompiler.setSchemaAware(true))更容易完成,但也可以通过在TransformerFactory上设置属性FeatureKeys.XSLT_SCHEMA_AWARE(“http://saxon.sf.net/feature/xsltSchemaAware”)使用JAXP来完成。你必须明确设置它的原因是,如果样式表在编译时知道所有内容都是无类型的,那么处理无类型文档的速度会更快,因此我们不希望人们在迁移到Saxon-EE时会产生额外的成本,如果他们不是使用此功能。

将来请随时在saxonica.plan.io上提出支持问题,我们的目标是在24小时内给出答复。