Thomas 'PointedEars' Lahn wrote:
> Andreas Borutta wrote:
>> Es wird mir wohl nix übrig bleiben als 30mal Copy&Paste zu bemühen.
>
> Oder Du bemühst 1mal ein XSLT-Tutorial Deines geringsten Misstrauens.
Ich habe mich inzwischen näher mit dem Problem beschäftigt und dabei
gemerkt, dass aufgrund des Default-XHTML-Namespace das Extrahieren aus
XHTML-Dokumenten im Unterschied zum Extrahieren aus XML-Dokumenten (kein
Namespace notwendig) nicht trivial ist.
Den entscheidenden Hinweis hierzu fand ich unter
<
http://www.xmlplease.com/xhtmlxhtml>.
A) XML-Dokument als Basis, XHTML-Dokumente als Quellen (einfacher):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="include-from-xml.xsl"?>
<includes>
<include src="../XHTML/test.xhtml"/>
<include src="../XHTML/test2.xhtml"/>
</includes>
Entsprechendes Stylesheet (include-from-xml.xsl):
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="
http://www.w3.org/1999/xhtml"
xmlns="
http://www.w3.org/1999/xhtml">
<xsl:output method="xhtml"/>
<xsl:template match="/">
<html xmlns="
http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Including XHTML with XSLT, based on XML</title>
</head>
<body>
<h1>Including XHTML with XSLT, based on XML</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="includes">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="include">
<xsl:variable name="doc" select="document(@src)"/>
<li><xsl:value-of
select="$doc/xhtml:html/xhtml:head/xhtml:title"/></li>
</xsl:template>
</xsl:stylesheet>
Testcase: <
http://PointedEars.de/markup/xml/XSL/include.xml>
B) XHTML-Dokument als Basis, XHTML-Dokumente als Quellen:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="include-from-xhtml.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ATTLIST div
src CDATA #IMPLIED>
]>
<html xmlns="
http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Including XHTML with XSLT, based on XHTML</title>
</head>
<body>
<h1>Including XHTML with XSLT, based on XHTML</h1>
<div class="includes">
<div src="../XHTML/test.xhtml"></div>
<div src="../XHTML/test2.xhtml"></div>
</div>
</body>
</html>
Entsprechendes Stylesheet:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="
http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="
http://www.w3.org/1999/xhtml"
xmlns="
http://www.w3.org/1999/xhtml">
<xsl:output method="xhtml"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="xhtml:div">
<xsl:choose>
<xsl:when test="contains(@class, 'includes')">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:when>
<xsl:when test="@src">
<xsl:variable name="doc" select="document(@src)"/>
<li><xsl:value-of select="$doc/xhtml:html/xhtml:head/xhtml:title"
/></li>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Identitätstransformation (identity transformation):
Kopieren, wenn es kein spezielles Template gibt -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Testcase: <
http://PointedEars.de/markup/xml/XSL/include.xhtml>
[Statt im internen Subset ein src-Attribut für das div-Element zu
deklarieren – damit das Basis-XHTML-Dokument valide ist –, kann man
natürlich auch das bereits deklarierte class-Attribut und den Inhalt des
entsprechenden div-Elements verwenden. Die Lösung mit src-Attribut hat
den Vorteil, dass man im Fehlerfall nichts sieht. Die Lösung mit Inhalt
hat den Vorteil, dass man im Fehlerfall immer etwas sieht.]
Das "Kopieren" des Inhalts der body-Elemente der XHTML-"Datenquellen" sowie
die Transformation der hN- in h(N+1)-Elemente u. ä. bleibt dem geneigten
Leser zur Übung überlassen.
PointedEars
--
> If you get a bunch of authors […] that state the same "best practices"
> in any programming language, then you can bet who is wrong or right...
Not with javascript. Nonsense propagates like wildfire in this field.
-- Richard Cornford, comp.lang.javascript, 2011-11-14