Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 从命令行到带有共享参考文档的文件目录的Saxon XSLT转换_Xml_Xslt_Xslt 2.0_Saxon - Fatal编程技术网

Xml 从命令行到带有共享参考文档的文件目录的Saxon XSLT转换

Xml 从命令行到带有共享参考文档的文件目录的Saxon XSLT转换,xml,xslt,xslt-2.0,saxon,Xml,Xslt,Xslt 2.0,Saxon,我正在从命令行运行saxon9he来转换xml文件目录。xslt加载两个文档作为共享参考文档以查找公共信息,即一个是验证公司并返回公司信息以显示在生成的html页面上的公司列表,另一个是验证零件并返回零件信息以显示在页面上的零件列表。这些文件在xml目录中可以有多个版本,因此我得到了它们的一个集合,并使用最后一个版本,即最近的一个 我想知道的是,在命令行转换期间,这些共享文档是为所有输入xml文件加载/缓存到内存中,还是为正在处理的目录中的每个输入xml文件重新加载 示例xml <comp

我正在从命令行运行saxon9he来转换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>

主街1号
城市
装货单
美国
800-123-4567
示例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文件,并希望尽可能提高效率


谢谢大家!

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

如果查找文件是静态已知的(
doc('lookup.xml')
),则可以通过添加选项
--preevaluatedcfunction:on
,强制在编译时加载文档。由于样式表只编译一次,这将产生只加载查找文档一次的效果


通常,如果从Java应用程序(使用s9api)而不是从命令行运行作业,您将对执行有更多的控制。

谢谢。我已经尝试了“-preevaluatedOfcfunction:on”。我有两个xslt,我将其更改为静态引用两个xml文件。不幸的是,其中一个的运行时间从1个半小时变为3个多小时。这有什么原因吗?我的另一个xslt每次尝试访问4个xml文件中的2个时都会收到2个重复错误,因为它们不在目录中。doc-available()是否有助于使用--preevaluatedcf函数?抱歉,无法解释。我需要有演示问题的示例文件,以便调查发生了什么情况。然后又添加了预评估的函数,它大大加快了2的速度!我想不出第三个,但一开始就没那么慢。非常感谢!!!