XML / XML-Datenstrukturen / 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>
<xsl:variable name="v1" as="xs:string+">
<xsl:for-each
select="('Meier',
'Schulze',
'Müller',
'Schmidt',
1 to 10)">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:variable>
</codeblock>
<p>Im nächsten Schritt konvertieren Sie die Sequenz
in einen String mit dem Trennzeichen ";".</p>
<codeblock>
<xsl:variable name="v2" as="xs:string">
<xsl:value-of select="string-join($v1, ';')"/>
</xsl:variable>
</codeblock>
<p>Denselben Effekt erreichen Sie übrigens auch
mit dem <i>separator</i>-Attribut von
<i>xsl:value-of</i>:</p>
<codeblock>
<xsl:value-of
select="'Meier',
'Schulze',
'Müller',
'Schmidt',
1 to 10"
separator=";"/>
</codeblock>
<p>Zur Kontrolle können Sie sich den generierten
String anzeigen lassen:</p>
<codeblock>
<xsl:value-of select="$v2"/>
</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>
<xsl:for-each
select="tokenize(xs:string($v2), ';')">
<item>
<xsl:value-of select="."/>
</item>
</xsl:for-each>
</codeblock>
<p>Resultat:</p>
<codeblock>
<item>Meier</item>
<item>Schulze</item>
<item>Müller</item>
<item>Schmidt</item>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
<item>10</item>
</codeblock>
</section>
wg / 3. April 2020
Fragen? Anmerkungen? Tipps?
Bitte nehmen Sie Kontakt zu mir auf.
V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn
☎ 0151. 750 360 61 * eMail: info10@wilfried-grupe.de