fra@ma: XSLT Zugriff auf Elemente von extern eingebunden XML-Daten

Hallo,
ich verzweifel gerade an meinen ersten XSL-Versuchen.
Ich möchte durch Vorgaben einer XML-Seitenstruktur (xml01), die mit XSLT verarbeitet wird, eine externe XML-Datei (xml02) einbinden.
Leider finde ich keine Lösung, wie ich auf die Elemente in xml02 zur Laufzeit zugreifen kann.
Ich habe schon alle möglichen Dinge probiert und gelesen aber nichts bringt mich weiter.
Kann mir bitte mal jemand auf die Sprünge helfen?

Hier mal das Beispiel:

--xml01-- (Seitenstruktur)

  
<?xml version="1.0" encoding="utf-8"?>  
<?xml-stylesheet type="text/xsl" href="testen.xsl" ?>  
<site:seiten xmlns:site="http://test.tt/site">  
	<site:seite param="start">  
		<site:linkname>Startseite</site:linkname>  
		<site:url>test.htm</site:url>  
		<site:inhalt url="testinhalt01.xml" />  
	</site:seite>  
	<site:seite param="programm">  
		<site:linkname>Programm</site:linkname>  
		<site:url>programm.htm</site:url>  
		<site:inhalt url="testinhalt02.xml" />  
	</site:seite>  
</site:seiten>  

--xml02-- (extere XML-Datei)

  
<?xml version="1.0" encoding="utf-8"?>  
<in:inhalt xmlns:in="http://test.tt/inhalt">  
	<in:head>  
		<meta name="robots" content="index, follow" />  
	</in:head>  
	<in:body>  
		<in:block>  
			<in:bild url="testbild01.jpg" alt="Teste Bild 01" />  
			<in:bild url="testbild02.jpg" alt="Teste Bild 02" />  
		</in:block>  
		<in:text>  
			Ein Text zum Testen  
		</in:text>  
	</in:body>  
</in:inhalt>  

--xsl--

  
<?xml version="1.0" encoding="utf-8"?>  
<xsl:stylesheet version="1.0"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
    xmlns:site="http://test.tt/site"  
    xmlns:in="http://test.tt/inhalt">  
	  
	<xsl:output doctype-system="about:legacy-compat" method="html" indent="yes"/>  
	  
	<xsl:template match="/">  
		<xsl:for-each select="site:seiten/site:seite[@param = $aktuell]">  
  
        	<!-- _____________________ Externe Daten importieren  -->  
            <xsl:if test="site:inhalt/@url != ''">  
                <xsl:variable name="extern_xml" select="document(site:inhalt/@url)" />  
            </xsl:if>  
  
  
			<html lang="de">  
				<head>  
					<meta charset="utf-8" />  
					<title>  
                    	<xsl:value-of select="site:linkname" />  
                    </title>  
                    <xsl:value-of select="$extern_xml/in:inhalt/in:head" />  
				</head>  
				<body>  
					<div id="seitenAufbau">  
                    	<xsl:call-template name="hauptnavigation" />  
                        <xsl:call-template name="inhalt_extern" />  
                    </div>  
				</body>  
        	</html>  
		</xsl:for-each>  
	</xsl:template>  
  
    <xsl:template name="hauptnavigation">  
        <nav id="hauptnavigation">  
            <ul>  
                <xsl:for-each select="/site:seiten/site:seite">  
                    <li>  
                        <a>  
                            <xsl:attribute name="href">  
                                <xsl:value-of select="site:url" />  
                            </xsl:attribute>  
                            <xsl:value-of select="site:linkname" />  
                        </a>  
                    </li>  
                </xsl:for-each>  
            </ul>  
        </nav>  
    </xsl:template>  
  
    <xsl:template name="inhalt_extern">  
    	<xsl:value-of select="$extern_xml/in:inhalt/in:body" />  
    </xsl:template>  
</xsl:stylesheet>  

Geparst wird dies mit PHP XSLTProcessor, von da wird auch die Variable $aktuell übergeben.
Leider ist es ja nicht möglich mit <xsl:template match=Variable zu zugreifen.
Mit xsl:copy-of habe ich auch schon experimentiert, allerdings kopiere ich da ja nicht in das Ausgangs-XML sondern in das Ergebnis-XML.
Ich stehe echt auf dem Schlauch.

Vielen Dank vorab!

  1. Hallo fra@ma,

    ja XSL kann schon nervig sein.

    Mir fallen zwei möglich Lösungen ein (beide nicht getestet):

    Variante 1: Auf die Variable verzichten. Du kannst Teile aus einem externen Dokument auch direkt mit einem XPath-Ausdruck ansprechen. Anhand deines Beispiels würde das so aussehen:

      
    ...  
    <xsl:value-of select="document(site:inhalt/@url)/in:inhalt/in:head" />  
    ...  
    
    

    Variante 2: Du kannst innerhalb eines <xsl:variable> Elementes auch weitere XSL-Elements verwenden, z.B. <xsl:copy-of>:

      
    ...  
    <xsl:variable name="extern_xml">  
       <xsl:copy-of select="document(site:inhalt/@url)" />  
    </xsl:variable>  
    ...  
    
    

    Falls das nicht funktioniert melde dich nochmal hier.

    Beste Grüße

    Stareagle

    1. Hallo Stareagle,
      vielen Dank, werde ich dann gleich mal testen!
      VG fr@gma

  2. Moin,

    fehlt da nicht noch ein <xsl:param name="aktuell" />?