Загрузите несколько файлов с документом XSL и сохраните их в отдельных переменных.

я написал небольшое преобразование XSL, чтобы объединить несколько .xml-документов в один файл. Для этой цели я использую функцию document(). В настоящее время мое решение работает нормально, но я спрашиваю себя, есть ли более элегантный способ сделать это.

Есть ли другой способ загрузить несколько файлов и сохранить каждый из них в переменной, а затем обработать эти несколько переменных в xsl:copy-of?

Вот пример моего текущего преобразования XSL (XSL является частью конвейера 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>

person B Polit    schedule 09.10.2018    source источник


Ответы (3)


В соответствии с этим (документ 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">.
person Tomalak    schedule 09.10.2018
comment
Пробовал решения, подобные приведенному выше примеру кода, но я получаю следующее сообщение об ошибке: Требуемый тип элемента контекста для дочерней оси — node(); предоставленное значение (.) имеет тип элемента xs:string — есть идеи, что я делаю неправильно? Я использую последнюю версию Oxygen XML и встроенный процессор XSL. - person B Polit; 09.10.2018
comment
Попробуйте простой <xsl:copy-of select="document(.)/*" />. - person Tomalak; 09.10.2018

Если процессор 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.

person Martin Honnen    schedule 09.10.2018

Вы спросите: есть ли другой способ загрузить несколько файлов и сохранить каждый из них в переменной, а затем обработать эти несколько переменных в 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, добавив немного больше кода).

person Michael Kay    schedule 09.10.2018