Zwei XML-Dateien mit XSL verknüpfen

HaCkAttaCk2001

Grünschnabel
Hi.

Seit 21 Uhr bin ich am tüfteln, wie ich 2 meiner XML-Dateien verknüpfen kann, um dann später per XSL-FO ein PDF auszugeben.
Die Angelegenheit erscheint sooo simpel: in einer XML sind Eingaben mit Kategorien als Nummer, in einer anderen XML sind die Nummern und deren zugehöriger Name. Die Nummer soll in der ausgegebenen PDF in den Name umtransformiert werden.

Hier mal die stark zusammengekürzten Dateien zum Verständnis:
Objekte.xml
Code:
<Objekte>
    <Objekt kategorie="1.3">
        <Bezeichnung>Objekt 1</Bezeichnung>
    </Objekt>
</Objekte>

Kategorien.xml
Code:
<Kategorien>
    <Kategorie nummer="1.3">Bauteil</Kategorie>
</Kategorien>

In der XSL-Datei gebe ich ein Standard-A4-Format aus und die Übersicht der Zellen.

pdf.xsl
Code:
...
<xsl:template match="Objekte">
    ...
    <fo:table-body>
        <xsl:apply-templates>
    </fo:table-body>
    ...
</xsl:template>

<xsl:template match="Objekt">
    ...
    <fo:table-cell>
        <fo:block>
            <xsl:value-of select="Bezeichnung"/>
        </fo:block>
     </fo:table-cell>
    <fo:table-cell>
        <fo:block>
            <xsl:value-of select="document('Kategorien.xml')/Kategorien/Kategorie[@kategorie=@nummer]"/>
        </fo:block>
     </fo:table-cell>
    ...

Ich suche praktisch die Entsprechung eines SELECT Bezeichnung FROM Kategorien.xml WHERE nummer = kategorie
Dass das mit dem zweiten Attribut nicht funktioniert, habe ich bereits gemerkt, es wird wohl eine Variable nötig sein, als [@kategorie=$nummer]. Nur wie fülle ich diese korrekt?

Noch vor <xsl:template match="Objekte"> habe ich folgendes angefangen. Doch es ist absolut nicht korrekt, da ich mich nicht in die Syntax hineindenken kann.

Code:
<xsl:template match="/">
    <xsl:for-each select="document('Kategorien.xml')/Kategorien/Kategorie">
        <xsl:variable name="@nr"><!-- Name der Kategorie und Zuordnung zur Ziffer... wie? --></xsl:variable>
    </xsl:for-each>
</xsl:template>

Ich hoffe, ihr könnt mir helfen.
 
Zuletzt bearbeitet:
Code:
<?xml version="1.0" encoding="UTF-8"?>

<root>
	<Objekte>
		<Objekt kategorie="1.3">
			<Bezeichnung>Objekt 1</Bezeichnung>
		</Objekt>
	</Objekte>
	<Objekte>
		<Objekt kategorie="1.4">
			<Bezeichnung>Objekt 2</Bezeichnung>
		</Objekt>
	</Objekte>
	<Objekte>
		<Objekt kategorie="1.5">
			<Bezeichnung>Objekt 3</Bezeichnung>
		</Objekt>
	</Objekte>
</root>

Code:
<?xml version="1.0" encoding="UTF-8"?>



<root>
	<Kategorien>
		<Kategorie nummer="1.3">Festplatte</Kategorie>
	</Kategorien>
	<Kategorien>
		<Kategorie nummer="1.4">Monitor</Kategorie>
	</Kategorien>
	<Kategorien>
		<Kategorie nummer="1.5">Tastatur</Kategorie>
	</Kategorien>
	<Kategorien>
		<Kategorie nummer="1.6">Mouse</Kategorie>
	</Kategorien>
	<Kategorien>
		<Kategorie nummer="1.7">CD Rom</Kategorie>
	</Kategorien>
	<Kategorien>
		<Kategorie nummer="1.8">DVD Laufwerk</Kategorie>
	</Kategorien>
</root>
Erforder parser beherrscht xi:include z.b saxon xsltproc
argumente parameter xi:eek:n xinclude

Code:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xi="http://www.w3.org/2001/XInclude">
	<xi:include href="Objekt.xml"/>
	<xi:include href="Kategorien.xml"/>
</root>

Code:
<?xml version="1.0" encoding="UTF-8" ?>

<!-- New document created with EditiX at Mon Apr 13 06:56:14 CEST 2009 -->

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
	<xsl:output method="xml" indent="yes"/>
	<xsl:template match="/">
		<fo:root>
			<fo:layout-master-set>
				<fo:simple-page-master page-height="297mm" page-width="210mm" margin="15mm 15mm 15mm 15mm" master-name="my-page">
					<fo:region-body margin="0mm 0mm 0mm 0mm"/>
				</fo:simple-page-master>
			</fo:layout-master-set>
			<fo:page-sequence master-reference="my-page">
				<fo:flow flow-name="xsl-region-body">
					<fo:table border-style="solid" border-width="0.2mm" border-color="#00FF00">
						<fo:table-column column-width="40mm"/>
						<fo:table-column column-width="25mm"/>
						<fo:table-column column-width="25mm"/>
						<fo:table-header color="#00F000">
							<fo:table-row>
								<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
									<fo:block font-weight="bold">Spalte 1</fo:block>
								</fo:table-cell>
								<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
									<fo:block font-weight="bold">Spalte 2</fo:block>
								</fo:table-cell>
								<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
									<fo:block font-weight="bold">Spalte 2</fo:block>
								</fo:table-cell>
							</fo:table-row>
						</fo:table-header>
						<fo:table-body>
							<xsl:apply-templates select="//Kategorien"/>
						</fo:table-body>
					</fo:table>
				</fo:flow>
			</fo:page-sequence>
		</fo:root>
	</xsl:template>
	<xsl:template match="Kategorien">
		<xsl:apply-templates select="Kategorie"/>
	</xsl:template>
	<xsl:template match="Kategorie">
		<fo:table-row>
			<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
				<fo:block>
					<xsl:value-of select="."/>
				</fo:block>
			</fo:table-cell>
			<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
				<fo:block>
					<xsl:value-of select="./@nummer"/>
				</fo:block>
			</fo:table-cell>
			<xsl:variable name="nummer" select="./@nummer"/>
			<fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
				<fo:block>
					<xsl:value-of select="//Objekte/Objekt[@kategorie=$nummer]/Bezeichnung"/>
				</fo:block>
			</fo:table-cell>
		</fo:table-row>
	</xsl:template>
</xsl:stylesheet>
Ergebnis erg.fo
Code:
<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:layout-master-set>
      <fo:simple-page-master page-height="297mm" page-width="210mm" margin="15mm 15mm 15mm 15mm" master-name="my-page">
         <fo:region-body margin="0mm 0mm 0mm 0mm"/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body">
         <fo:table border-style="solid" border-width="0.2mm" border-color="#00FF00">
            <fo:table-column column-width="40mm"/>
            <fo:table-column column-width="25mm"/>
            <fo:table-column column-width="25mm"/>
            <fo:table-header color="#00F000">
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block font-weight="bold">Spalte 1</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block font-weight="bold">Spalte 2</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block font-weight="bold">Spalte 2</fo:block>
                  </fo:table-cell>
               </fo:table-row>
            </fo:table-header>
            <fo:table-body>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Festplatte</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.3</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Objekt 1</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Monitor</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.4</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Objekt 2</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Tastatur</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.5</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Objekt 3</fo:block>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>Mouse</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.6</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block/>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>CD Rom</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.7</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block/>
                  </fo:table-cell>
               </fo:table-row>
               <fo:table-row>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>DVD Laufwerk</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block>1.8</fo:block>
                  </fo:table-cell>
                  <fo:table-cell border-style="solid" border-width="0.2mm" border-color="#0000FF">
                     <fo:block/>
                  </fo:table-cell>
               </fo:table-row>
            </fo:table-body>
         </fo:table>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

Helmut Hagemann
 
Zurück