Hallo zusammen,
ich habe eine XML-Datei, in der ein DOCTYPE eingetragen ist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE BMECAT SYSTEM "bmecat_2005_tnc.dtd">
<BMECAT version="2005">
<HEADER>
<CATALOG>
...
</CATALOG>
...
</HEADER>
<T_NEW_CATALOG>
<CLASSIFICATION_SYSTEM>
<CLASSIFICATION_SYSTEM_NAME>udf_PRODUCTCATALOG1.0</CLASSIFICATION_SYSTEM_NAME>
<CLASSIFICATION_GROUPS>
<CLASSIFICATION_GROUP type="node">
<CLASSIFICATION_GROUP type="node">
<CLASSIFICATION_GROUP_ID>0</CLASSIFICATION_GROUP_ID>
<CLASSIFICATION_GROUP_NAME lang="deu">Produktkatalog</CLASSIFICATION_GROUP_NAME>
</CLASSIFICATION_GROUP>
<CLASSIFICATION_GROUP type="node">
<CLASSIFICATION_GROUP_ID>1</CLASSIFICATION_GROUP_ID>
<CLASSIFICATION_GROUP_NAME lang="deu">Pfad 1</CLASSIFICATION_GROUP_NAME>
<CLASSIFICATION_GROUP_PARENT_ID>0</CLASSIFICATION_GROUP_PARENT_ID>
</CLASSIFICATION_GROUP>
<CLASSIFICATION_GROUP type="node">
<CLASSIFICATION_GROUP_ID>2</CLASSIFICATION_GROUP_ID>
<CLASSIFICATION_GROUP_NAME lang="deu">Pfad 1.1</CLASSIFICATION_GROUP_NAME>
<CLASSIFICATION_GROUP_PARENT_ID>1</CLASSIFICATION_GROUP_PARENT_ID>
</CLASSIFICATION_GROUP>
<CLASSIFICATION_GROUP type="node">
<CLASSIFICATION_GROUP_ID>3</CLASSIFICATION_GROUP_ID>
<CLASSIFICATION_GROUP_NAME lang="deu">Pfad 1.1.1</CLASSIFICATION_GROUP_NAME>
<CLASSIFICATION_GROUP_PARENT_ID>2</CLASSIFICATION_GROUP_PARENT_ID>
</CLASSIFICATION_GROUP>
<CLASSIFICATION_GROUP type="leaf">
<CLASSIFICATION_GROUP_ID>4</CLASSIFICATION_GROUP_ID>
<CLASSIFICATION_GROUP_NAME lang="deu">Produkt</CLASSIFICATION_GROUP_NAME>
<CLASSIFICATION_GROUP_PARENT_ID>3</CLASSIFICATION_GROUP_PARENT_ID>
</CLASSIFICATION_GROUP>
...
</CLASSIFICATION_GROUPS>
</CLASSIFICATION_SYSTEM>
<PRODUCT>
...
</PRODUCT>
</T_NEW_CATALOG>
</BMECAT>
Jetzt möchte ich mit einer XSL-Datei Daten in eine Text-Datei exportieren. Das klappt auch ganz gut, wenn ich die DOCTYPE-Zeile auskommentiere:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:for-each select="/BMECAT/T_NEW_CATALOG/CLASSIFICATION_SYSTEM/CLASSIFICATION_GROUPS">
<xsl:apply-templates select="CLASSIFICATION_GROUP"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="CLASSIFICATION_GROUP">
<xsl:if test="@type='leaf'">
<xsl:call-template name="rekursiv_class_group_leaf">
<xsl:with-param name="parentID" select="CLASSIFICATION_GROUP_PARENT_ID"/>
<xsl:with-param name="lang" select="CLASSIFICATION_GROUP_NAME/@lang"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="rekursiv_class_group_leaf">
<xsl:param name="parentID"/>
<xsl:param name="lang"/>
<xsl:call-template name="rekursiv_class_group_node">
<xsl:with-param name="parentID" select="CLASSIFICATION_GROUP_PARENT_ID"/>
<xsl:with-param name="lang" select="CLASSIFICATION_GROUP_NAME/@lang"/>
</xsl:call-template>
<xsl:text>/</xsl:text>
<xsl:value-of select="CLASSIFICATION_GROUP_NAME"/>
<xsl:text> - </xsl:text>
<xsl:value-of select="CLASSIFICATION_GROUP_ID"/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template name="rekursiv_class_group_node">
<xsl:param name="parentID"/>
<xsl:param name="lang"/>
<xsl:for-each select="../CLASSIFICATION_GROUP">
<xsl:if test="CLASSIFICATION_GROUP_ID=$parentID">
<xsl:if test="CLASSIFICATION_GROUP_NAME/@lang=$lang">
<xsl:call-template name="rekursiv_class_group_node">
<xsl:with-param name="parentID" select="CLASSIFICATION_GROUP_PARENT_ID"/>
<xsl:with-param name="lang" select="$lang"/>
</xsl:call-template>
<xsl:if test="CLASSIFICATION_GROUP_PARENT_ID">/</xsl:if>
<xsl:value-of select="CLASSIFICATION_GROUP_NAME"/>
</xsl:if>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Wie zu sehen sein sollte, ich brauche nur die Daten aus einem Abschnitt:
/BMECAT/T_NEW_CATALOG/CLASSIFICATION_SYSTEM/CLASSIFICATION_GROUPS
Und da dort ein Baum hinterlegt ist, möchte ich den kompletten Pfad über die Knoten ("node") bis zum Blatt ("leaf") haben.
Kann mir jemand dabei helfen, wie ich die Zeile
<xsl:for-each select="/BMECAT/T_NEW_CATALOG/CLASSIFICATION_SYSTEM/CLASSIFICATION_GROUPS">
ändern muß, damit das klappt? Irgendwie stehe ich auf dem Schlauch. Oder muß ich ein weiteres Template erstellen? Das habe ich zwar schon versucht, war aber recht erfolglos.
Gruß, Nils.