Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Processor-Problem in XSL?

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> XML/XSD/XSL/XSLT
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Cyberfuzzy
Gast





BeitragVerfasst am: 05. Dez 2005 10:08    Titel: Processor-Problem in XSL? Antworten mit Zitat

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 &lt; und &gt; übersetzt. Dann sieht das Ergebnis so aus:

&lt;/data&gt;
&lt;/record&gt;
&lt;record type="ITEM" verb="CREATE"&gt;
&lt;data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;

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

BeitragVerfasst am: 05. Dez 2005 15:18    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> XML/XSD/XSL/XSLT Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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