如果你想運行XSLT,使用.BAT腳本,在給定的每一個XML文件文件夾(您在OP中的第一個選項)我可以想到3種方式:
答:基本上做一個「for」循環來處理每個單獨的文件通過命令行。 (好惡。)
B.使用collection()
指向輸入文件夾,並使用xsl:result-document
在一個新的文件夾中創建輸出文件。
下面是一個例子XSLT 2.0(與撒克遜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: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(與撒克遜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。您需要通過添加新模板來執行檢查/更改來覆蓋身份模板。
另請注意,輸出文件夾名稱只有一個參數。