使用XSL文档加载多个文件并将它们存储在单独的变量中

时间:2018-10-09 07:12:12

标签: xml xslt xpath tei

我写了一个XSL转换,将多个.xml文档合并到一个文件中。为此,我正在使用document()函数。目前,我的解决方案运行良好,但是我在问自己是否有一种更优雅的方法来做到这一点。

还有另一种方法来加载多个文件并将每个文件存储在一个变量中,然后在xsl:copy-of中处理这些多个变量吗?

这是我当前XSL转换的一个示例(XSLT是XPROC管道的一部分,第一个文件在管道中加载):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all">




<!-- Laden der übrigen TEI-Dateien -->
<xsl:variable name="Fig2" select="document('2_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig3" select="document('3_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig4" select="document('4_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig5" select="document('5_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig6" select="document('6_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig7" select="document('7_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig8" select="document('8_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig9" select="document('9_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig10" select="document('10_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig11" select="document('11_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig12" select="document('12_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig13" select="document('13_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig14" select="document('14_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig15" select="document('15_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig16" select="document('16_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig17" select="document('17_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig18" select="document('18_Figuration_transformiert.xml', tei:TEI)"/>
<xsl:variable name="Fig19" select="document('19_Figuration_transformiert.xml', tei:TEI)"/>


<xsl:template match="/">
    <html>
        <xsl:copy-of select="."/>
        <xsl:copy-of select="$Fig2"/>
        <xsl:copy-of select="$Fig3"/>  
        <xsl:copy-of select="$Fig4"/>
        <xsl:copy-of select="$Fig5"/>
        <xsl:copy-of select="$Fig6"/>
        <xsl:copy-of select="$Fig7"/>
        <xsl:copy-of select="$Fig8"/>
        <xsl:copy-of select="$Fig9"/>
        <xsl:copy-of select="$Fig10"/>
        <xsl:copy-of select="$Fig11"/> 
        <xsl:copy-of select="$Fig12"/>
        <xsl:copy-of select="$Fig13"/>
        <xsl:copy-of select="$Fig14"/>
        <xsl:copy-of select="$Fig15"/>
        <xsl:copy-of select="$Fig16"/>
        <xsl:copy-of select="$Fig17"/>
        <xsl:copy-of select="$Fig18"/>
        <xsl:copy-of select="$Fig19"/>
      </html>
</xsl:template>

</xsl:stylesheet>

3 个答案:

答案 0 :(得分:0)

大致内容(此处用作输入的XML文档无关紧要):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tei="http://www.tei-c.org/ns/1.0"
xmlns="http://www.w3.org/1999/xhtml" exclude-result-prefixes="#all">

    <xsl:param name="files" select="'1_Figuration_transformiert.xml;2_Figuration_transformiert.xml;...'" />

    <xsl:template match="/">
        <html>
            <xsl:for-each select="tokenize($files, ';')">
                <xsl:copy-of select="document(.)/*" />
            </xsl:for-each>
        </html>
    </xsl:template>

</xsl:stylesheet>

文件名的实际列表应从外部传递,而不是进行硬编码。这使集成到批处理过程变得容易。

您可以改变方法。例如,

  • 如果所有文档均具有相同的后缀,则可以列出数字并使用
    document(concat(., '_Figuration_transformiert.xml'))
  • 如果文档数量固定且没有空格,则可以使用
    <xsl:for-each select="1 to 19">
  • 如果循环的开始和结束是可变的,则可以为它们设置<xsl:param>并使用use
    <xsl:for-each select="$start to $end">

答案 1 :(得分:0)

如果XProc处理器将Saxon 9用作XSLT 2处理器,那么您还可以尝试使用collection函数是否通过例如<xsl:copy-of select="collection(concat(base-uri(), '?select=*_Figuration_transformiert.xml'))"/>,而不是所有单独的copy-of指令。

请参见http://saxonica.com/html/documentation9.8/sourcedocs/collections.html

答案 2 :(得分:0)

您问:是否有另一种方法可以加载多个文件并将每个文件存储在一个变量中,然后在xsl:copy-of中处理这些多个变量?

好吧,否:如果您想要18个变量,每个变量保存一个文件,那么您将需要18个变量声明。但是,即使没有18个变量,您也可以达到相同的效果。

首先,您根本不需要任何变量,因为每个变量仅使用一次。您可以将它们全部内联(用用于初始化变量$Fig6的表达式替换变量引用Fig6)。

第二,如果URI总是像这样被系统地命名,那么您不需要全部拼写出来:您可以将名称放在单个变量中

<xsl:variable name="figs" select="(2 to 18)!(. || '_Figuration_transformiert.xml')"/>

,然后将对$Fig6的引用替换为对$figs[6]的引用。然后,您当然不需要拼写$figs[1]$figs[2]等:您可以循环处理它们。

(上面的变量声明是XSLT 3.0语法,但是您可以在XSLT 2.0中使用更多代码来实现相同的功能)。