Abfangen, wenn ein Text mit einem betsimmten Wort beginnt
Marc Nilius
- xsl
0
MudGuard
0 svg4you0 Marc Nilius0 svg4you0 Marc Nilius0 Marc0 Thomas J.S.0 svg4you
Hallo!
Ich bin "ganz frisch" was XSL angeht und entsprechend unsicher. Folgendes möchte ich machen:
Ein Auszug aus einer XML-Datei:
<RAHMEN>
<HL>Auszug aus Verordnung</HL>
<P>blabla</P>
</RAHMEN>
soll verwandelt werden in
<AUSZUG>
<HL>Auszug aus Verordnung</HL>
<P>blabla</P>
</RAHMEN>
Wichtig dabei ist, dass es noch andere <RAHMEN> gibt. Es werden nur die <RAHMEN> zu <AUSZUG>, die auch das Wort Auszug in <HL> tragen. Ich habe das folgendermassen versucht:
<xsl:template match="RAHMEN">
<xsl:if test="./HL[text()[starts-with(.,'Auszug')]]">
<AUSZUG>
xsl:apply-templates/
</AUSZUG>
</xsl:if>
</xsl:template>
Das bringt aber leider keinen Erfolg. Was mache ich falsch, bzw. was muss ich richtigerweise machen?
Vielen Dank schonmal!
Hi,
soll verwandelt werden in
<AUSZUG>
<HL>Auszug aus Verordnung</HL>
<P>blabla</P>
</RAHMEN>
Hm - Du willst unwohlgeformtes XML erzeugen?
Wichtig dabei ist, dass es noch andere <RAHMEN> gibt. Es werden nur die <RAHMEN> zu <AUSZUG>, die auch das Wort Auszug in <HL> tragen. Ich habe das folgendermassen versucht:
<xsl:template match="RAHMEN">
<xsl:if test="./HL[text()[starts-with(.,'Auszug')]]">
<AUSZUG>
xsl:apply-templates/
Willst Du hier vielleicht das xsl:copy oder xsl:copy-of verwenden?
</AUSZUG>
Das paßt nicht zu obiger Aussage, wie das Ergebnis aussehen soll ...
</xsl:if>
</xsl:template>
Das bringt aber leider keinen Erfolg.
Wie wärs mit einer vernünftigen Problembeschreibung?
Was bekommst Du als Ergebnis? Was erwartest Du stattdessen?
cu,
Andreas
Hallo!
soll verwandelt werden in
<AUSZUG>
<HL>Auszug aus Verordnung</HL>
<P>blabla</P>
</RAHMEN>Hm - Du willst unwohlgeformtes XML erzeugen?
Stimmt. Deswegen muss da auch nicht </RAHMEN>, sondern </AUSZUG> hin.
</AUSZUG>
Das paßt nicht zu obiger Aussage, wie das Ergebnis aussehen soll ...
Dann passt das auch wieder.
Wie wärs mit einer vernünftigen Problembeschreibung?
Was bekommst Du als Ergebnis? Was erwartest Du stattdessen?
Ergebnis: Keins - oder anders gesagt: meine Bedingung matcht nicht, alles bleibt, als ob keine Konvertierung angewendet wurde.
Erwartung: Das oben beschriebene (und korrigierte) Code-Beispiel mit <AUSZUG>.
Ich hoffe, jetzt wirds klarer.
Viele Grüße,
Marc
Tach Marc,
<RAHMEN>
<HL>Auszug aus Verordnung</HL>
<P>blabla</P>
</RAHMEN>
...
<xsl:template match="RAHMEN">
<xsl:if test="./HL[text()[starts-with(.,'Auszug')]]">
Das sollte bezogen auf den XML-Schnipsel so aussehen:
<xsl:if test="HL[starts-with(.,'Auszug')]">
Man liest sich,
svg4you
Hallo!
Das sollte bezogen auf den XML-Schnipsel so aussehen:
<xsl:if test="HL[starts-with(.,'Auszug')]">
Mmmhh, klappt leider irgendwie nicht. Habe das insofern angepasst, als dass ich statt starts-with contains verwendet habe. Aber das sollte am Grundsatz ja eigentlich nichts ändern:
<xsl:template match="RAHMEN">
<xsl:if test="HL[contains(.,'Auszug')]">
<AUSZUG>
<xsl:apply-templates/>
</AUSZUG>
</xsl:if>
</xsl:template>
Was kann es sein? Was mache ich vielleicht noch falsch?
Viele Grüße,
Marc
Tach Marc,
Mmmhh, klappt leider irgendwie nicht. Habe das insofern angepasst, als dass ich statt starts-with contains verwendet habe. Aber das sollte am Grundsatz ja eigentlich nichts ändern:
<xsl:template match="RAHMEN">
<xsl:if test="HL[contains(.,'Auszug')]">
<AUSZUG>
xsl:apply-templates/
</AUSZUG>
</xsl:if>
</xsl:template>
>
> Was kann es sein? Was mache ich vielleicht noch falsch?
Die Funktion starts-with() ist schon passend, aber statt <xsl:apply-templates/> ist wohl <xsl:copy-of select="."/> sinnvoller.
Man liest sich,
svg4you
Hallo!
Ich habe contains statt starts-with genommen, da der gesuchte Textteil nicht zwingend am Anfang des Strings stehen muss.
<xsl:copy-of select="."/> habe ich nicht genommen, da es auch Rahmen gibt, die nicht konvertiert werden. Deswegen gibt es eine weitere Regel, die alle Rahmen übernimmt, soweit sie vorher nicht durch zB die Auszugs-Regel ersetzt wurden. Nehme ich also bei den Auszugs-Regeln copy-of, bleibt mir dieser Rahmen ja zweimal erhalten (als Rahmen und als Auszug), oder nicht?
Leider funktioniert das trotzdem noch nicht, die Regel wird nicht angewendet. Was kann ich noch versuchen?
Viele Grüße,
Marc
Hallo!
Ich habs jetzt so geloest (ist bestimmt nicht der Königsweg, kommt aber nah an die Vorschlaege ran): :-)
<xsl:template match="RAHMEN">
<xsl:choose>
<xsl:when test="HL[contains(.,'Auszug')]">
<AUSZUG>
<xsl:apply-templates/>
</AUSZUG>
</xsl:when>
<xsl:when test="HL[contains(.,'auszug')]">
<AUSZUG>
<xsl:apply-templates/>
</AUSZUG>
</xsl:when>
<xsl:otherwise>
<RAHMEN>
<xsl:apply-templates/>
</RAHMEN>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Und so funktionierts jetzt wunderbar. Vielen Dank fuer die Tipps!
Viele Grüße,
Marc
Hallo,
Ich habs jetzt so geloest (ist bestimmt nicht der Königsweg, kommt aber nah an die Vorschlaege ran): :-)
[code lang=xml]
<xsl:template match="RAHMEN">
xsl:choose
<xsl:when test="HL[contains(.,'Auszug')]">
<xsl:when test="HL[contains(.,'Auszug')] or HL[contains(.,'auszug')]">
Dann kannst du dir das 2. when sparen.
Grüße
Thomas
Tach Marc,
<xsl:when test="HL[contains(.,'Auszug')]">
<AUSZUG>
xsl:apply-templates/
</AUSZUG>
</xsl:when>
<xsl:when test="HL[contains(.,'auszug')]">
<AUSZUG>
xsl:apply-templates/
</AUSZUG>
</xsl:when>
Kompakter wäre:
~~~xml
<xsl:when test="HL[contains(.,'Auszug') or contains(.,'auszug')]">
<AUSZUG>
xsl:apply-templates/
</AUSZUG>
</xsl:when>
Man liest sich,
svg4you