Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cyberfuzzy Gast
|
Verfasst am: 05. Dez 2005 10:08 Titel: Processor-Problem in XSL? |
|
|
Hallo,
ich habe ein kleines Problem in XSL. Mal schauen, ob ich es halbwegs vernünftig erklären kann.
Ich habe ein XSL, das durch xsl:copy und xsl:copy-of die XML teilweise kopiert.
So sieht die Quell-XML aus (gekürzt):
<dataarea>
<record type="ITEM" verb="CREATE">
<key>399-1</key>
<params PLANT="5010,5020"/>
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</data>
</record>
</dataarea>
Die Ausgabe per XSL sieht dann so aus:
<dataarea>
<record verb="CREATE" type="ITEM">
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</data>
</record>
</dataarea>
Wenn in der XML mehrere Werte duch Komma getrennt in PLANT stehen (wie hier: <params PLANT="5010,5020"/>), dann soll pro Wert das record mit verschiedenen Inhalten ausgeführt werden. Die gewünschte Ausgabe müsste hier also zwei Mal da sein:
<dataarea>
<record verb="CREATE" type="ITEM">
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</data>
</record>
<record type="ITEM" verb="CREATE">
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
...
</data>
</record>
</dataarea>
Um das zu lösen, habe ich ein Template (Split), das sich selbst aufrufen kann um die Werte zu teilen. Dann kann es auch das Template aufrufen, dass den Inhalt von record kopiert. Allerdings wird bei dem nächsten Inhalt "data" und "record" nicht mehr geschlossen, sondern direkt angehängt. Also habe ich es im Template "Split" manuell geschlossen und wieder geöffnet, wenn es nicht der letzte Wert ist:
<![CDATA[</data></record><record type="ITEM" verb="CREATE"><data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">]]>
Die gewünschte Ausgabe sieht dann an dieser Stelle so aus:
</data>
</record>
<record type="ITEM" verb="CREATE">
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Zumindest sieht es mit meinem built-in Processor von StylusStudio so aus. In einer anderen Umgebung wird der Xalan2 Processor eingesetzt. Und da tritt dann das Problem auf, dass er die Zeichen < und > in < und > übersetzt. Dann sieht das Ergebnis so aus:
</data>
</record>
<record type="ITEM" verb="CREATE">
<data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Somit kann das XML nicht mehr korrekt gelesen werden, da der record-Teil nur ein Mal vorhanden ist - mit diesem Zeug in der Mitte.
Kann ich dem Xalan irgendwie mitgeben, dass er die den Text im <![CDATA[ nicht verändern darf? Wenn ich <![CDATA[ ganz weglasse, dann meckert er natürlich, dass ich ein Tag schließe, das ich garnicht geöffnet habe. Damit hat er ja recht, da der Tag aus einem anderen Template geöffnet wurde, das wiederum das Template "Split" aufgerufen hat. Ich kann aber Split nicht mehrmals aufrufen, da ich mir dort keine Variablen merken kann.
Klingt jetzt etwas kompliziert, aber ich hoffe, dass sich vielleicht manche etwas darunter vorstellen können. Ihr könnt natürlich gerne fragen, wenn etwas unklar ist.
Ich freue mich über jeden Lösungsansatz.
Hier noch das gesamte Template "Split", vielleicht wird es dann deutlicher:
<xsl:template name="Split">
<xsl:param name="value" select="@PLANT"/>
<xsl:choose>
<xsl:when test="contains($value, ',')">
<xsl:variable name="first" select='substring-before($value,",")'/>
<xsl:variable name='rest' select='substring-after($value,",")'/>
<!-- Wert ueber anderes Template verarbeiten oder ausgeben -->
<xsl:call-template name="ItemCreate"><xsl:with-param name="PLANT2" select="$first"/></xsl:call-template>
<!-- data und record schließen und neu oeffnen -->
<![CDATA[</data></record><record type="ITEM" verb="CREATE"><data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">]]>
<!-- Wenn noch ein Komma enthalten ist - also $rest <> 0 ist -->
<xsl:if test="$rest">
<xsl:call-template name="Split"><xsl:with-param name="value" select="$rest"/></xsl:call-template>
</xsl:if>
</xsl:when>
<xsl:otherwise>
<!-- Wert ueber anderes Template verarbeiten oder ausgeben -->
<xsl:call-template name="ItemCreate"><xsl:with-param name="PLANT2" select="$value"/></xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Grüße
Cyberfuzzy
--
http://www.cyberfuzzy.com |
|
Nach oben |
|
|
|
kurellajunior Administrator
Anmeldungsdatum: 14.02.2005 Beiträge: 214 Wohnort: Berlin-Pankow
|
Verfasst am: 05. Dez 2005 15:18 Titel: |
|
|
Problem erkannt.
1. Tags von Hand schließen ist Pfui!
2. Xalan verhält sich völlig korrekt. CDATA sektionen sollen schließlich im Browser so angezeigt werden wie gefunden.
3. Lösung: Der template aufruf muss auserhalb des Records erfolgen. und zwar so oft wie es Kommata im String gibt plus eins (Schleife). Du musst den String nur ermitteln, solange Du noch außerhalb des Templates bist, damit das record-template sauber abshcließen kann.
War das verständlich?
Jan _________________
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum nicht posten Du kannst Dateien in diesem Forum nicht herunterladen
|
|