Announcement

Collapse
No announcement yet.

conditional multiple outputs

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • conditional multiple outputs

    Hallo Allerseits,

    Bin ein xsl-Anfänger. Sage ich erstmals dazu

    ich möchte mehrere Ausgabedateien (file1.xml, file2.xml, file3.xml) simultan füllen. Vielleicht lässt sich mein Problem mit einem Beispiel leichter verstehen.

    ich habe folgende Beispiel-Datei example.xml:

    <Datei>
    <group id="1">
    <element>xxx_to file 1</element>
    <element>aaa_to file 2</element>
    </group>

    <group id="2"/>
    <element>yyy_to file 1</element>
    <element>bbb_to file 2</element>
    </group>

    <group id="3"/>
    <element>zzz_to file 1</element>
    <element>ccc_to file 3</element>
    </group>
    </Datei>

    Jetzt möchte ich ein Xsl-Skript bauen, das folgende Logik ausführt:

    1- lies ein Element aus example.xml,
    2- wenn das Element den Substring "file 1" enthält, dann muss das Element in file1.xml hinzugefügt werden,
    wenn das Element den Substring "file 2" enthält, dann muss es in "file2.xml" und bei "file 3" , ist dann das Element in "file3.xml" hinzufügen.
    3- lies den nächsten Element und führe wieder Schritt 2 aus.

    Ich dachte ich kann, z.B die Funktion <xsl: output href="file1.xml"/> benutzen für so etwas? Weiß jemand, ob es geht?

  • #2
    Wenn XSLT 2.0 möglich ist, dann steht xsl:result-document zur Verfügung wobei die einzelnen Ergebnisdokumente über mehrere xslutput-Elemente zugewiesen werden, siehe Beispiel.

    Nachtrag: Hier mal ein Ansatz mit XSLT 2.0-Techniken, inkl. Gruppierung nach dem gesuchten Teilstring:
    Code:
    <?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:fn="http://www.w3.org/2005/xpath-functions"
      exclude-result-prefixes="fn xs">
    
      <xsl:output method="xml" encoding="UTF-8" indent="yes" name="ausgabe"/>
    
      <xsl:template match="Datei">
    
        <xsl:for-each-group select="//element" group-by="fn:substring-after(.,'to ')">
    
          <xsl:variable name="file" select="fn:concat('file:///C:/Temp/',fn:replace(fn:substring-after(.,'to '),' ',''),'.xml')"/>
    
          <xsl:result-document href="{$file}" format="ausgabe">
            <root>
              <xsl:for-each select="current-group()">
                <xsl:copy-of select="."/>
              </xsl:for-each>
            </root>
          </xsl:result-document>
    
        </xsl:for-each-group>
    
      </xsl:template>
    
    </xsl:stylesheet>
    Die Ausgabe besteht aus file1.xml, file2.xml und file3.xml im Verzeichnis C:\Temp:
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <element>xxx_to file 1</element>
      <element>yyy_to file 1</element>
      <element>zzz_to file 1</element>
    </root>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <element>aaa_to file 2</element>
      <element>bbb_to file 2</element>
    </root>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <element>ccc_to file 3</element>
    </root>
    Zuletzt editiert von Thomas Meinike; 14.05.2009, 12:17.

    Comment


    • #3
      Hallo Thomas,

      danke für den Hinweis. Jedoch gibt Dein Vorschlag die Ausgabedateien hintereinander aus; was auch nicht schlecht ist.
      Aber was ich wollte, ist eine simultane Ausgabe der Dateien. Nun habe ich über den xsl-List von mulberry erfahren, dass so 'was noch im Forschungszustand bei einem "xsl work group" ist und wird "coloured widget " genannt.

      Danke Dir für die Mühe. Bis bald...

      Comment

      Working...
      X