Home
Über mich
Veröffentlichungen

XML XML-Schema XPath XSL-T XSL-FO XQuery XProc SVG

XML / XML-Datenstrukturen / XML-Struktur: mixed content

XML-Struktur: mixed content

XML-Struktur: mixed content

➪ Gegenüber den stark strukturierten XML-Dokumenten bestehen bei den schwächer strukturierten "mixed-content"-Dokumenten zwischen den einzelnen XML-Elementen deutlich weniger gegenseitige Abhängigkeiten aufgrund gemeinsamer Parentnodes oder aufgrund von Primär-/Sekundärschlüsselbeziehungen. Zudem ist mit häufigen optionalen oder xs:choice-Elementen zu rechnen. Sofern eine gegenseitige Abhängigkeit überhaupt besteht, muss diese auf anderem Wege herleitbar sein, etwa durch sequenzielle Abfolge.

Siehe auch DITA, DocBook, HTML, SVG, FOP.

Das folgende Beispiel zeigt einen Mix aus klarer Basisstruktur, die mit XPath gezielt adressiert werden kann (Abschnitt/para) und einer gemischten Abfolge aus Textinhalt und Formatierungsanweisungen (innerhalb para: text(), kursiv, fett, link), für deren systematische Auswertbarkeit eine hohe Flexibilität erforderlich ist.

Während es sich anbietet, die Abschnitt/para-Struktur durch xsl:for-each zu verarbeiten, bleibt für die Formatierungsanweisungen innerhalb para vorrangig die Arbeit mit "xsl:template match" bzw. xsl:apply-templates. So vielfältig wie die Input-Struktur dürfte auch die Programmierlogik bei deren Auswertung gestaltet werden. Auch hier empfiehlt sich eine effiziente, qualitätsbewusste Koordination der Teamarbeit, um die langfristigen Wartungskosten unter Kontrolle zu behalten.


<?xml version="1.0" encoding="iso-8859-1"?>
<Abschnitt>
  <title>Namespaces</title>
  <para>Die enorme Gestaltungsflexibilität der 
<kursiv>XML-Dokumente</kursiv> zwingt zu 
<fett>systematischer Strukturierung</fett>, 
damit die <kursiv>XML-Dokumente</kursiv> 
systematisch ausgewertet werden können.</para>
<para>Aber auch eine klare systematische 
Strukturierung von <kursiv><fett>Element- und 
Attributnamen</fett></kursiv> sowie deren 
<fett><kursiv>Datentypen</kursiv></fett> 
(etwa durch <link 
l="http://www.w3.org/2001/XMLSchema">XML-Schema</link>) 
reicht nicht immer aus, begriffliche 
Kollisionen zu vermeiden. </para>
</Abschnitt>

Oder werten Sie aus einem DITA-Dokument einen <section>-Abschnitt aus tokenize aus:


<section>
   <title><i>tokenize</i> vs. <i>string-join</i></title>
   <p>Die <i>tokenize</i>-Funktion ist im Grunde das 
      Gegenstück zu <xref href="stringjoin.xml">string-join</xref>. 
      Während <i>string-join</i> in der Lage ist, eine Sequenz 
      mit mehreren Items in einen Einzelstring zu konvertieren, 
      wobei auch Trennzeichen eingefügt werden können (im 
      Beispiel: ";"), kann <i>tokenize</i> einen derartigen 
      <xref href="string.xml">String</xref> unter Zuhilfenahme 
      des Trennzeichens wieder in eine Sequenz konvertieren. </p>
   <p>Um das zu verdeutlichen, generieren Sie zunächst eine 
      Sequenz aus den Werten 'Meier', 'Schulze', 'Müller', 
      'Schmidt' sowie den Zahlen 1 bis 10.</p>
   <codeblock>
&lt;xsl:variable name="v1" as="xs:string+"&gt;
  &lt;xsl:for-each 
       select="('Meier', 
                'Schulze', 
                'Müller', 
                'Schmidt', 
                1 to 10)"&gt;
    &lt;xsl:value-of select="."/&gt;
  &lt;/xsl:for-each&gt;
&lt;/xsl:variable&gt;
   </codeblock>
   <p>Im nächsten Schritt konvertieren Sie die Sequenz 
      in einen String mit dem Trennzeichen ";".</p>
   <codeblock>
&lt;xsl:variable name="v2" as="xs:string"&gt;
    &lt;xsl:value-of select="string-join($v1, ';')"/&gt;
&lt;/xsl:variable&gt;
   </codeblock>
   <p>Denselben Effekt erreichen Sie übrigens auch 
      mit dem <i>separator</i>-Attribut von 
      <i>xsl:value-of</i>:</p>
   <codeblock>
&lt;xsl:value-of 
     select="'Meier', 
             'Schulze', 
             'Müller', 
             'Schmidt', 
             1 to 10" 
     separator=";"/&gt;
   </codeblock>
   <p>Zur Kontrolle können Sie sich den generierten 
      String anzeigen lassen:</p>
   <codeblock>
&lt;xsl:value-of select="$v2"/&gt;
   </codeblock>
   <p>Hier ist also der String:</p>
   <codeblock>
Meier;Schulze;Müller;Schmidt;1;2;3;4;5;6;7;8;9;10
   </codeblock>
   <p>Nun kommt <i>tokenize</i> ins Spiel, das den 
      String in eine Itemlist aufsplittet:</p>
   <codeblock>
&lt;xsl:for-each 
     select="tokenize(xs:string($v2), ';')"&gt;
  &lt;item&gt;
    &lt;xsl:value-of select="."/&gt;
  &lt;/item&gt;      
&lt;/xsl:for-each&gt;
   </codeblock>
   <p>Resultat:</p>
   <codeblock>
&lt;item&gt;Meier&lt;/item&gt;
&lt;item&gt;Schulze&lt;/item&gt;
&lt;item&gt;Müller&lt;/item&gt;
&lt;item&gt;Schmidt&lt;/item&gt;
&lt;item&gt;1&lt;/item&gt;
&lt;item&gt;2&lt;/item&gt;
&lt;item&gt;3&lt;/item&gt;
&lt;item&gt;4&lt;/item&gt;
&lt;item&gt;5&lt;/item&gt;
&lt;item&gt;6&lt;/item&gt;
&lt;item&gt;7&lt;/item&gt;
&lt;item&gt;8&lt;/item&gt;
&lt;item&gt;9&lt;/item&gt;
&lt;item&gt;10&lt;/item&gt;
   </codeblock>
</section>

wg / 3. April 2020



Fragen? Anmerkungen? Tipps?

Bitte nehmen Sie Kontakt zu mir auf.






Vielen Dank für Ihr Interesse an meiner Arbeit.



V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de

www.wilfried-grupe.de/XML_Strukturalternativen4.html