Kerstin: XML aus XSL heraus aufrufen

Beitrag lesen

Hallo,

kannst du noch ein Beispiel-XML posten?

sicher:

Ehm ... na ja, genau das ist  - meine Meinung nach - falsch. Du versuchst Layout mit dem XML zu mischen und das auszulagern. Besser, weil logischer und besser wartbar, wäre das Layout in einem XSL-Template auszulagern.

Das sehe ich immer noch anders.
Ich habe eine XML-Datei mit dem Hauptlayout (cdcatalog_book.xml). Darin enthalten sind Platzhalter, die entweder durch die Daten in cdcatalog.xml oder durch weitere Layoutkomponenten ersetzt werden sollen. Die Layoutkomponenten selber sollen ebenfalls Platzhalter enthalten, die durch die Daten in cdcatalog.xml oder aus anderen daten.xml ersetzt werden sollen. Für mich ist das Layout der einzelnen Komponenten so viel besser händelbar, wenn diese in extra XML-Dateien abgelegt werden. Hier muss man einfach nur die Namen der Elemente und ggf. Attribute kennen, um das Design zu ändern. Eine Ablage in XSL erfordet die Kenntnis der Syntax von XSL - nur meine Meinung.

Mit einem:
<xsl:for-each select="document('cdcatalog_liste.xml')/*">[3]
   xsl:apply-imports/
</xsl:for-each>
sollte es gehen.

Ging auch ohne. Mit ist kein Unterschied zu merken.

Mein Fehler. (Aber dein XSLT-Prozessor sollte auch meckern!)
xsl:apply-imports/ kann nur innerhalb von xsl:template verwendet werden.

Nö, hat er nicht. Ich verwende XSLTPROC.

Weiters - auch mein Fehler, das übergesehen zu haben - in deinem zu importierenden XSL werden die Variablen zwar verwendet, aber nicht deklariert . (auch deshalb hätte dir eigentlich der Prozessor eine Fehlermelung liefern müssen)

Ja, da hat er gemeckert, weil er die ja nicht kannte. Deshalb hatte ich sie auch erstmal auskommentiert.

Ich habe keine Lösung dafür.

Schade.

Willst du unbedingt etwas auslagern, fände ich immer noch besser so (ebenfalls ohne "cdcatalog_liste.xml"):


<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:include href="formatknoten.xsl" />
<xsl:variable name="myXML" select="document('cdcatalog.xml')/catalog" />
<xsl:template match="/">
  <xsl:apply-templates />
</xsl:template>

<xsl:template match="*[name() != 'cd_liste']">
  xsl:copy
   <xsl:for-each select="@*">
    <xsl:copy />
   </xsl:for-each>
   <xsl:apply-templates />
  </xsl:copy>
</xsl:template>
<xsl:template match="cd_liste">
  <xsl:call-template name="formatnode">
   <xsl:with-param name="node" select="." />
   <xsl:with-param name="documentNode" select="$myXML/cd" />
   <xsl:with-param name="documentElements" select="$myXML/cd/title | $myXML/cd/artist" />
   <xsl:with-param name="documentNodeElementName" select="'tr'" />
   <xsl:with-param name="documentElementsElementName" select="'td'" />
  </xsl:call-template>
</xsl:template>
</xsl:stylesheet>

-------- formatknoten.xsl --------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="formatnode">
  <xsl:param name="node" />
  <xsl:param name="documentNode" />
  <xsl:param name="documentElements" />
  <xsl:param name="documentNodeElementName" />
  <xsl:param name="documentElementsElementName" />
  <xsl:for-each select="$node">
   <xsl:for-each select="$documentNode">
    <xsl:element name="{$documentNodeElementName}">
     <xsl:for-each select="current()/*[. = $documentElements]">
      <xsl:element name="{$documentElementsElementName}">
       <xsl:value-of select="." />
      </xsl:element>
     </xsl:for-each>
    </xsl:element>
   </xsl:for-each>
  </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Die Auslagerung wäre schon hilfreich und würde das ganze vielleicht übersichtlicher machen. Am Beispiel der cdcatalog.xml habe ich nur versucht, das Problem hier darzustellen. In Wirklichkeit gehts um sehr viel komplexere Daten, die durch XSL in das richtige Layout gebracht werden sollen. Mein XSL-File dazu umfasst nun auch schon fast 2000 Zeilen, in dem halt das Layout der Daten enthalten ist. Die Auslagerung würde eventuell ein wenig Übersichtlichkeit zurückbringen. Außerdem vielleicht auch etwas mehr 'professioneller' aussehen, als alles in eine Datei zu hämmern.

Ich danke Dir für die Diskussion und deine Hilfe. Den oberen Ansatz von Dir werde ich mal testen und schaun, ob mich das weiter bringt. Wenn nicht, muss ich wohl bei meiner jetzigen Lösung bleiben.

Liebe Grüße,
Kerstin