Frage zu einer Transformation

Tyr_17

Grünschnabel
Hallo zusammen,

ich bin XML/XSLT-Neuling und habe Probleme bei einer gewünschten Transformation. Ich erreiche nicht das Ergebnis das ich mir vorstelle und wollte nun im Forum mal rumfragen, ob jemandem die Lösung einfällt.

Ich habe eine XSLT-Datei mit der ich erreichen möchte, dass der Benutzer einer XML-Datei bei der Auswahl eines bestimmten Hinweistypen (es gibt drei: "danger, warning, caution") automatisch in seinem Dokument das entsprechende Wort in Großbuchstaben stehen hat (quasi ein autotext). Also bei der auswahl des Signalworts dager das Wort "DANGER" usw. Zusätzlich soll bei der Auswahl berücksichtigt werden, ob es sich um ein deutsches oder englisches Dokument handelt (Also bei caution UND de Ausgabe von "ACHTUNG!". Bei caution und en: "CAUTION!"). Die entsprechenden Tags seht Ihr hier:

Das ist mein eigener Ansatz (der nicht geklappt hat (es wird nichts ausgegeben)). Vielleicht könnt Ihr mir einen Tipp geben, ob der Ansatz korrekt ist:

<xsl:template match="signalword">
<xsl:choose>
<xsl:when test="@class='danger' and @language='en'">
DANGER!
</xsl:when>
<xsl:when test="@class='danger' and @language='de'">
ACHTUNG!
</xsl:when>
...
</xsl:choose>
</xsl:template>

"class" und "language" sind bereits definierte Elemente und korrekt programmiert.



Vielen Dank! Ich freu mich auf Ihre Posts!

Thomas
 
Hi.
Das ist mein eigener Ansatz (der nicht geklappt hat (es wird nichts ausgegeben)). Vielleicht könnt Ihr mir einen Tipp geben, ob der Ansatz korrekt ist:

<xsl:template match="signalword">
<xsl:choose>
<xsl:when test="@class='danger' and @language='en'">
DANGER!
</xsl:when>
<xsl:when test="@class='danger' and @language='de'">
ACHTUNG!
</xsl:when>
...
</xsl:choose>
</xsl:template>

"class" und "language" sind bereits definierte Elemente und korrekt programmiert.
class und language müßten aber Attribute sein.

Wie sieht dein Quelldokument aus?

Wie sieht der Stylesheet aus? Wird das template überhaupt verarbeitet?

Gruß
 
Hallo und erstmal vielen Dank für Deine Hilfe!

"class und language müßten aber Attribute sein."
class befindet sich in einer externen entity-Datei und ist folgendermaßen definiert:
<!ENTITY % class "classnode CDATA #IMPLIED">


Wie sieht dein Quelldokument aus?
Ich habe verschiedene Entity-Dateien (.ent) in denen die attribute und elemente definiert sind. Dazu kommen diverse stylesheets. Es ist also schwierig/unmöglich
hier alles zu posten.

SIgnalwort wird in der zentralen ENT-Datei definiert:

<!ELEMENT signalword %plaintext;>
<!ATTLIST signalword
%nid;
%validfor;
%translate;

dazu (in derselben Datei) definiere ich meine Struktur für den Sicherheitshinweis:

<!ENTITY % emb-safetyadvicecontent "(safetysymbol?, signalword, cause_emb, consequences_emb, action_emb)">

Wie sieht der Stylesheet aus? Wird das template überhaupt verarbeitet?
Das template wird verarbeitet. Lediglich die Verarbeitung des SIgnalworts schlägt fehl.

Das Stylesheet (für das Signalwort) sieht dann so aus wie ich es oben bereits beschrieben habe. Dazu kommt dann noch das attribute-set (in einer weiteren Stylesheet-Datei)


<xsl:attribute-set name="signalword">
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="font-size">11pt</xsl:attribute>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<xsl:attribute name="hyphenate">false</xsl:attribute>
</xsl:attribute-set>


Ich hoffe Du/Ihr kannst/könnt mir helfen das Problem zu lösen. Wie gesagt: Mir kommt es darauf an die oben genannte Problemstellung des autotextes zu lösen und vielleicht hilft hierbei auch einfach eine generelle Beschreibung des Tags für diese Art Aufgabe.
 
Noch als kleine Ergänzung:

<!ENTITY % languages "(de | en | fr | it | es | pt | nl | da | el | sv | fi | no | is | ga |
mt |cs | pl | ru | hu | ro | br | sk | bg | sl | et | lv | lt | hr | gr | tr)">

und das "finestruct" von "class" bedeutetu.a. PCDATA und einige andere referenzierte Elemente
 
Hi.

So kommen wir überhaupt nicht weiter. Entweder du postest alle relevanten Stellen deiner DTD oder ein Beispieldokument. Ein signalword Element hat ja überhaupt keine class bzw. lang Attribute.

Dann war meine Frage ob das signalword template überhaupt verarbeitet wird, also ob der XSL Prozessor überhaupt in das Template "reingeht". Das kannst du prüfen indem du einfach immer irgendwas ausgibst unabhängig davon was das xsl:choose macht.

Gruß
 
Hey,

sorry, wie gesagt: Bin Neuling in Sachen XML/XSL. Ich poste jetzt mal etwas und hoffe es hilft Dir weiter:

Hier wird die Struktur bzw. der Inhalt des Elements "signalword" definiert "Strucktur.ent"

<!ENTITY % emb-safetyadvicecontent "(safetysymbol?, signalword, cause_emb, consequences_emb, action_emb)"> <!--new-->

...

<!ELEMENT signalword %plaintext;>
<!ATTLIST signalword
%nid;
%validfor;
%translate;
>

...

<!ENTITY % plaintext "( #PCDATA | emphasis | inlinegraphic | quoted | user-interface | variable |
graphiclink | safetyadvice_emb_paragraph | subscript | superscript |
textlink | transno | inlinedata)*">
-------------------------------------------

Hier die Transformation von "signalword" Beschreibung.xsl

<xsl:template match="signalword[parent::safetyadvice_emb_paragraph]">
<fo:block xsl:use-attribute-sets="signalword">
<xsl:apply-templates/>
</fo:block>
</xsl:template> -bis hierher wird richtig transformiert (es funktioniert)-
<!--xsl:template match="signalword"> -das ist der Versuch, der aber nicht geklappt hat (deshalb ist er
auskommentiert-
<xsl:choose>
<xsl:when test="@class='danger'">
DANGER!
</xsl:when>
<xsl:when test="@class='warning'">
WARNING!
</xsl:when>
<xsl:when test="@class='caution'">
CAUTION!
</xsl:when>
</xsl:choose>
</xsl:template-->

...

passend dazu die Transformation des gesammten Hinweises

<!-- safetyadvice_emb_paragraph -->
<xsl:template match="safetyadvice_emb_paragraph">
<fo:block xsl:use-attribute-sets="safetyadvice_emb_paragraph">
<fo:table space-after="3pt" space-before="3pt">
<fo:table-column column-width="{$marginalia-width}"/>
<fo:table-column column-width="{$marginalia-space}"/>
<fo:table-column column-width="{$content-width-2}"/>
<fo:table-body start-indent="1mm">
<fo:table-row>
<fo:table-cell text-align-last="right">
<fo:block margin-top="6pt" text-align="center"> <!-- new -->
<xsl:choose>
<xsl:when test="@class='danger'">
<fo:external-graphic src="{$icon-path}\danger_symbol{$icon-format}" content-width="{$icon-emb-safetyadvice-width}"/>
</xsl:when>
<xsl:when test="@class='warning'">
<fo:external-graphic src="{$icon-path}\warning_symbol{$icon-format}" content-width="{$icon-emb-safetyadvice-width}"/>
</xsl:when>
<xsl:when test="@class='caution'">
<fo:external-graphic src="{$icon-path}\caution_symbol{$icon-format}" content-width="{$icon-emb-safetyadvice-width}"/>
</xsl:when>
<xsl:when test="@class='notice'">
<fo:external-graphic src="{$icon-path}\notice_{$language}{$icon-format}" content-width="{$icon-emb-safetyadvice-width}"/>
</xsl:when>
</xsl:choose>
</fo:block>
<xsl:apply-templates select="safetyadvice_emb_paragraph"/>

</fo:table-cell>
<fo:table-cell/>
<fo:table-cell xsl:use-attribute-sets="safetyadvice_emb_content">
<fo:block margin-bottom="2mm" margin-top="2mm">
<xsl:apply-templates select="*[not(self::safetysymbol)]"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</xsl:template>


weitere Transformation von "signalword" ..und wieder die des gesammten SiHi's in der dafür vorgesehenen XSL-Datei

<xsl:attribute-set name="safetyadvice_emb_paragraph">
<xsl:attribute name="margin-left">-<xsl:value-of select="$marginalia-indent-2"/></xsl:attribute>
<xsl:attribute name="margin-top">3pt</xsl:attribute>
<xsl:attribute name="margin-bottom">3pt</xsl:attribute>
<xsl:attribute name="margin-right">3pt</xsl:attribute>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<xsl:attribute name="clear">both</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="safetyadvice_emb_content">
</xsl:attribute-set>
<xsl:attribute-set name="signalword">
<xsl:attribute name="font-weight">bold</xsl:attribute>
<xsl:attribute name="font-size">11pt</xsl:attribute>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<xsl:attribute name="hyphenate">false</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="cause_emb">
<xsl:attribute name="font-size">11pt</xsl:attribute>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<xsl:attribute name="hyphenate">false</xsl:attribute>
</xsl:attribute-set>
<xsl:attribute-set name="consequences_emb">
<xsl:attribute name="font-size">11pt</xsl:attribute>
<xsl:attribute name="keep-together.within-page">always</xsl:attribute>
<xsl:attribute name="hyphenate">false</xsl:attribute>
</xsl:attribute-set>
 
Schlussendlich noch das von Dir gewünschte Beispiedokument

<maintenance>
<heading></heading>
<descriptive prodclass-1="" infoclass-1="" infoclass-2="">
<heading></heading>
<descriptive_body>
<paragraph>Jetzt versuchen wir das mal mit dem eingebetteten Sicherheitshinweis. Achtung, jetzt kommt er gleich:
<safetyadvice_emb_paragraph class="caution">
<signalword>ACHTUNG!</signalword>
<cause_emb>Das ist die Art und Quelle. Das ist die Art und Quelle. Das ist die Art und Quelle. Das ist die Art und Quelle. </cause_emb>
<consequences_emb>Das sind die Folgen. Das sind die Folgen. Das sind die Folgen. Das sind die Folgen. </consequences_emb>
<action_emb>Das sind die Maßnahmen. Das sind die Maßnahmen. Das sind die Maßnahmen. Das sind die Maßnahmen. Das sind die Maßnahmen. </action_emb>
</safetyadvice_emb_paragraph>
So, das war der eingebettete Sicherheitshinweis. Hoffentlich hats geklappt?! So, das war der eingebettete Sicherheitshinweis. Hoffentlich hats geklappt?!
</paragraph>
</descriptive_body>
</descriptive>
</maintenance>
 
Hi.

Bitte verwende die Code-Tags! ([code=xml]...[/code] für XML-Code etc.)

Wenn du gleich das Beispieldokument präsentiert hättest, hättest du uns viel Zeit gespart.

Wie anhand der DTD schon zu sehen war hat ein signalword Element gar kein class oder language Attribut. Die beiden Attribute sind dem übergeordneten safetyadvice_emb_paragraph Element zugeordnet.

Du kannst also mit folgenden XPath von einem signalword Element aus darauf zugreifen:
Code:
parent::safetyadvice_emb_paragraph/@class
oder kürzer:
Code:
../@class
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Vielen herzlichen Dank und entschuldige bitte nochmals meine Anfängerfehler. Das nächste Malw eiß ich es.
 
Zurück