来自命令行的Saxon XSLT转换,用于具有共享参考文档的文件目录

时间:2014-03-23 23:07:35

标签: xml xslt xslt-2.0 saxon

我从命令行运行saxon 9HE来转换xml文件的目录。 xslt将一些文档作为共享参考文档加载以查找公共信息 - 即。一个是公司列表,用于验证公司并返回公司信息以显示在生成的html页面上,另一个是部件列表,用于验证零件并返回要在页面上显示的零件信息。这些文件在xml目录中可以有多个版本,因此我得到了它们的集合,并取最后一个,这是最新的。

我想知道的是在命令行转换期间,这些共享文档是否已加载/缓存到所有输入xml文件的内存中,或者是否为正在处理的目录中的每个输入xml文件重新加载?

示例xml

<companies>
    <company code="123"/>
    <address>
    <street>1 MAIN STREET</street>
    <city>City</city>
    <state>ST</state>
    <country>USA</country>
    <phoneNumber>800-123-4567</phoneNumber>
    </address>
    </company>
</companies>

示例xslt

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
           xmlns="http://www.w3.org/1999/xhtml">
   <xsl:output method="xhtml" xpath-default-namespace="http://www.w3.org/1999/xhtml" 
           doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
           doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" 
           indent="yes" 
           omit-xml-declaration="yes"/>

<xsl:param name="currentDir">false</xsl:param>
<xsl:variable name="companyCollection" select="collection(iri-to-uri(concat  ('file:///',$currentDir, '/xml/', '?select=company_, '*.(xml|XML)')))[last()]"/> 
<xsl:variable name="companyDoc" select="$companyCollection//companies"/>  
<xsl:key name="companyKey" match="company" use="company/@mcode"/> 

如果为每个单独的转换加载它们,在处理xml文件目录时如何才能将它们加载一次?如果从命令行不可能,是否可以从java?

或者提前提交文件名并在document()命令中对其进行硬编码以防止为每个输入xml文件加载是最好/最快的吗?

<xsl:variable name="companyDoc" select="document(company.xml)/companies"/>

我们正在处理目录中的数千个xml文件,并希望尽可能高效。

谢谢!

1 个答案:

答案 0 :(得分:1)

当您从命令行处理目录时,每个输入文件都使用新的Tranformer进行处理,因此不会缓存源文档。

如果查找文件是静态已知的(doc('lookup.xml')),那么您可以通过添加选项--preEvaluateDocFunction:on来强制编译时加载文档。由于样式表只编译一次,因此只能加载一次查找文档。

如果从Java应用程序(使用s9api)而不是命令行运行作业,通常可以更好地控制执行。