如果您想使用 .bat 脚本在给定文件夹中的每个 XML 文件上运行 XSLT(您在 OP 中的第一个选项),我可以想到 3 种方法:
A.基本上做一个“for”循环来通过命令行处理每个单独的文件。(哇。)
B.用于collection()
指向输入文件夹并用于xsl:result-document
在新文件夹中创建输出文件。
这是一个示例 XSLT 2.0(使用 Saxon 9 测试):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pInputDir" select="'input'"/>
<xsl:param name="pOutputDir" select="'output'"/>
<xsl:variable name="vCollection" select="collection(concat($pInputDir,'/?*.xml'))"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:for-each select="$vCollection">
<xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
<xsl:result-document href="{concat($pOutputDir,'/',$vOutFile)}">
<xsl:apply-templates/>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
笔记:
这个样式表只是做一个身份转换。它通过未更改的方式传递 XML。您需要通过添加新模板来覆盖身份模板来进行检查/更改。
另请注意,输入和输出文件夹名称有 2 个参数。
您可能会遇到内存问题,collection()
因为它将文件夹中的所有 XML 文件加载到内存中。如果这是一个问题,请参见下文...
C.让您的 XSLT 处理目录中所有文件的列表。使用组合document()
和 Saxon 扩展函数saxon:discard-document()
来加载和丢弃文档。
这是我不久前用于测试的一个示例。
XML 文件列表(XSLT 的输入):
<files>
<file>file:///C:/input_xml/file1.xml</file>
<file>file:///C:/input_xml/file2.xml</file>
<file>file:///C:/input_xml/file3.xml</file>
<file>file:///C:/input_xml/file4.xml</file>
<file>file:///C:/input_xml/file5.xml</file>
<file>file:///C:/input_xml/file6.xml</file>
<file>file:///C:/input_xml/file7.xml</file>
<file>file:///C:/input_xml/file8.xml</file>
<file>file:///C:/input_xml/file9.xml</file>
<file>file:///C:/input_xml/file10.xml</file>
</files>
XSLT 2.0(用 Saxon 9 测试):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pOutputDir" select="'output'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="files">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="file">
<xsl:variable name="vOutFile" select="tokenize(document-uri(document(.)),'/')[last()]"/>
<xsl:result-document href="{concat($pOutputDir,$vOutFile)}">
<xsl:apply-templates select="document(.)/saxon:discard-document(.)" xmlns:saxon="http://saxon.sf.net/"/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
笔记:
同样,此样式表只是进行身份转换。它通过未更改的方式传递 XML。您需要通过添加新模板来覆盖身份模板来进行检查/更改。
另请注意,输出文件夹名称只有一个参数。