我从命令行运行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文件,并希望尽可能高效。
谢谢!
答案 0 :(得分:1)
当您从命令行处理目录时,每个输入文件都使用新的Tranformer进行处理,因此不会缓存源文档。
如果查找文件是静态已知的(doc('lookup.xml')
),那么您可以通过添加选项--preEvaluateDocFunction:on
来强制编译时加载文档。由于样式表只编译一次,因此只能加载一次查找文档。
如果从Java应用程序(使用s9api)而不是命令行运行作业,通常可以更好地控制执行。