Processing Instruction Anfang und Ende ersetzen

Transmitter

Erfahrenes Mitglied
Hi,

ich versuche folgendes:
<?F?>Text<?_F?>
nach:
<b>Text</b>
umzuwandeln.

Leider klappt es nicht so, wie ich mir das erhoffe:
Code:
<xsl:template match="processing-instruction('F') | processing-instruction('_F')">
    <b><xsl:text></xsl:text></b>
</xsl:template>
So dürfen processing instructions nicht aufgebaut sein.

Code:
<xsl:template match="processing-instruction('F') | processing-instruction('_F')">
    <b><xsl:text></xsl:text>
</xsl:template>

<xsl:template match="processing-instruction('_F')">
    </b>
</xsl:template>
Ein Start-Tag benötigt auch ein End-Tag.

Wie schaffe ich es denn in diesem Fall?
Hat jemand eine Idee für mich?
Danke schon mal
Bye, Transmitter
 
Hi.

Das wird nicht funktionieren. Dazu sind Processing Instruktionen auch nicht gedacht.

Es sieht alles etwas gequält aus. Was soll das denn werden?

Gruß
 
Das XML kommt von einem Zulieferer, der sich mit XML wohl nicht auseinandergesetzt hat. Das muss jetzt aber in ein vernünftiges XML Format zum Export in an anderes System überführt werden.
Falls das gar nicht funktioniert, muss ich wohl mit Suchen und Ersetzen arbeiten :(
 
Hi.

Du kannst versuchen den Textknoten der zwischen diesen Processing Instructions steht zu selektieren. Das sieht aber alles andere
als schön aus:
XML:
	<xsl:template match="text()[
						 count(preceding-sibling::processing-instruction('ZP')) &gt; 0 and
						 generate-id(preceding-sibling::processing-instruction('ZP')[last()]) =
						 generate-id((preceding-sibling::*|preceding-sibling::processing-instruction())[last()])

						 and
						 
						 count(following-sibling::processing-instruction('_ZP')) &gt; 0 and						 
						 generate-id(following-sibling::processing-instruction('_ZP')[1]) =
						 generate-id((following-sibling::*|following-sibling::processing-instruction())[1])
]">
		<b><xsl:value-of select="." /></b>
	</xsl:template>
Falls dort noch mehr solche (Sonder-)Fälle auftauchen, wärst du mit dem Ersetzen per RegEx evtl. besser dran...

Gruß
 
Zuletzt bearbeitet von einem Moderator:
hallo unter

regel

[16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

kurztest
Name erlaubt wie bei tag namen
nicht zu benutzen wie xml XML Xml und soweiter
end tag wird nicht benötigt

<?F hier1 poooo ?> erlaubt (!)
<?F hier1 poooo F?> erlaubt

zum testen
Code:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<?F hier1 poooo F?>
<item>
<?F hier2 poooo ?>
</item>
<?F hier3 poooo ?>
</root>

xsl
Code:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="processing-instruction()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>

ergebnis
Code:
<?xml version="1.0" encoding="utf-8"?>
				hier1 poooo 
				
								hier2 poooo 
				
				hier3 poooo

Helmut Hagemann
 
Zurück