Alle artikler

Kombinere data fra flere XML-dokumenter til ett HTML-dokument

Her er et eksempel på hvordan vi kan kombinere data fra flere XML-dokumenter til ett XML-dokument:

Vi lager tre enkle XML-dokumenter som representerer tenkte kapitler i en bok:

kapittel1.xml

<kapittel nummer="1" tittel="Dette er Kapittel 1">
    <avsnitt>Dette er avsnitt 1.</avsnitt>
    <avsnitt>Dette er avsnitt 2.</avsnitt>
</kapittel>

kapittel2.xml

<kapittel nummer="2" tittel="Dette er Kapittel 2">    
<avsnitt>Dette er avsnitt 1.</avsnitt>  
<avsnitt>Dette er avsnitt 2.</avsnitt>
<avsnitt>Dette er avsnitt 3.</avsnitt>
</kapittel>

kapittel3.xml

<kapittel nummer="3" tittel="Dette er Kapittel 3">    
<avsnitt>Dette er avsnitt 1.</avsnitt>  
<avsnitt>Dette er avsnitt 2.</avsnitt>
<avsnitt>Dette er avsnitt 3.</avsnitt>
<avsnitt>Dette er avsnitt 4.</avsnitt>
<avsnitt>Dette er avsnitt 5.</avsnitt>
</kapittel>

Her er et XML-skjema som kapittel-dokumentene kan valideres mot:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xsd:element name="kapittel">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="avsnitt" minOccurs="1" maxOccurs="unbounded"/>
            </xsd:sequence>
            <xsd:attribute name="nummer" type="xsd:integer"/>
            <xsd:attribute name="tittel" type="xsd:string"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Dette er et XSL-stilark som bruker funksjonen document() til å sette sammen kapitlene til en bok, dvs til ett html-dokument :

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">

    <xsl:template match="/">
        <html>
            <head>
                <title>Boktittel</title>
            </head>
            <body>
                <h1>Boktittel</h1>
                <!--Kapittel 1-->
                <xsl:call-template name="kapittel">
                    <xsl:with-param name="nummer" select="'kapittel1.xml'"/>
                </xsl:call-template>
                <!--Kapittel 2-->
                <xsl:call-template name="kapittel">
                    <xsl:with-param name="nummer" select="'kapittel2.xml'"/>
                </xsl:call-template>
                <!--Kapittel 3-->
                <xsl:call-template name="kapittel">
                    <xsl:with-param name="nummer" select="'kapittel3.xml'"/>
                </xsl:call-template>
            </body>
        </html>
    </xsl:template>

    <xsl:template name="kapittel">
        <xsl:param name="nummer"/>
        <xsl:for-each select="document($nummer)/kapittel">
            <xsl:text>&#xA;</xsl:text>
            <h2>
                <xsl:value-of select="@tittel"/>
            </h2>
            <xsl:text>&#xA;</xsl:text>
            <xsl:for-each select="avsnitt">
                <p>
                    <xsl:value-of select="."/>
                </p>
                <xsl:text>&#xA;</xsl:text>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

Resultatet av å kjøre dette stilarket mot seg selv, blir et HTML-dokument som ser slik ut:

<?xml version="1.0" encoding="UTF-8"?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        <title>Boktittel</title>
    </head>
    <body>
        <h1>Boktittel</h1>
        <h2>Dette er Kapittel 1</h2>
        <p>Dette er avsnitt 1.</p>
        <p>Dette er avsnitt 2.</p>
        <h2>Dette er Kapittel 2</h2>
        <p>Dette er avsnitt 1.</p>
        <p>Dette er avsnitt 2.</p>
        <p>Dette er avsnitt 3.</p>
        <h2>Dette er Kapittel 3</h2>
        <p>Dette er avsnitt 1.</p>
        <p>Dette er avsnitt 2.</p>
        <p>Dette er avsnitt 3.</p>
        <p>Dette er avsnitt 4.</p>
        <p>Dette er avsnitt 5.</p>
    </body>
</html>

I en nettleser ser dette dokumentet slik ut:

Boktittel

Dette er Kapittel 1

Dette er avsnitt 1.

Dette er avsnitt 2.

Dette er Kapittel 2

Dette er avsnitt 1.

Dette er avsnitt 2.

Dette er avsnitt 3.

Dette er Kapittel 3

Dette er avsnitt 1.

Dette er avsnitt 2.

Dette er avsnitt 3.

Dette er avsnitt 4.

Dette er avsnitt 5.