ubuntuusers.de

Text durch Datei ersetzen

Status: Gelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

ciciban

Anmeldungsdatum:
23. Januar 2006

Beiträge: 655

Servus,

Ich möchte in einer Datei Strings durch Inhalte anderer Dateien ersetzen, wobei sich der Dateiname aus dem String ergibt.

Der Hintergrund ist, dass ich ein .xsd mit XSLT verarbeiten will. Das .xsd schließt zwei weitere hierarchiestufen anderer .xsd mittels include ein: <xs:include schemaLocation="unterdatei.xsd"/>. Das versteht der XSLT-Compiler natürlich erst einmal nicht.

Was wäre ein effizienter Weg, als Futter für XSLT eine neue Datei zu schaffen, in der jeweils der Befehl <xs:include schemaLocation="unterdatei.xsd"/> durch den Inhalt von unterdatei.xsd ersetzt ist? XSLT sollte doch mit dieser Ergebnisdatei das gesamte Schema auswerte können, da m.w. include wirkt, wie benn dort statt des befehls die Datei stünde — oder liege ich da falsch?

Gibt es eine Alternative dazu, etwa: Gibt es einen Weg, dem XSLT-Compiler zu sagen, dass er die Unterschemas, die das .xsd einschließt, mitauszuwerten?

Danke voraus!

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

ciciban schrieb:

Servus,

Ich möchte in einer Datei Strings durch Inhalte anderer Dateien ersetzen, wobei sich der Dateiname aus dem String ergibt.

Der Hintergrund ist, dass ich ein .xsd mit XSLT verarbeiten will. Das .xsd schließt zwei weitere hierarchiestufen anderer .xsd mittels include ein: <xs:include schemaLocation="unterdatei.xsd"/>. Das versteht der XSLT-Compiler natürlich erst einmal nicht.

Sind es immer 2 Hierarchiestufen oder beliebig viele? Bei nur einer Hierarchiestufe komme ich auf sowas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
while read line
do 
  case $line in   
    "<xs:include schemaLocation="*) 
       f1=${line/*=\"/}
       f2=${f1/\"*/}
       cat $f2 ;;  
    *) 
       echo $line ;;  
  esac 
done < sample.xsd 

Sample.xsd:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<foo>
	<bar>
	</bar>
</foo>
<xs:include schemaLocation="a.xsd"/>
<xs:include schemaLocation="b.xsd"/>
<foo>
	<bar>
	</bar>
</foo>

a.xsd:

1
2
3
4
<fool>
	<bar>
	</bar>
</fool>

b.xsd:

1
2
3
4
<fox>
	<baz>
	</baz>
</fox>

Resultat:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<foo>
<bar>
</bar>
</foo>
<fool>
	<bar>
	</bar>
</fool>
<fox>
	<baz>
	</baz>
</fox>
<foo>
<bar>
</bar>
</foo>

Ersetzt man oben sample.xsd durch $1 und cat durch sample.sh sollte es auch rekursiv gehen.

Was wäre ein effizienter Weg, als Futter für XSLT eine neue Datei zu schaffen, in der jeweils der Befehl <xs:include schemaLocation="unterdatei.xsd"/> durch den Inhalt von unterdatei.xsd ersetzt ist? XSLT sollte doch mit dieser Ergebnisdatei das gesamte Schema auswerte können, da m.w. include wirkt, wie benn dort statt des befehls die Datei stünde — oder liege ich da falsch?

Ich habe zwar schon mal was mit xslt gemacht, aber bin da nicht mehr drin. Als einfach und flexibel habe ich es nicht in Erinnerung.

Mein erster Versuch mit

1
sed -r '/.xs:include.*="(.*).xsd"/r \1.xsd' sample.xsd

gelang leider nicht - Mustersubstitution im Read-File-Commando ist bei sed offenbar nicht vorgesehen. (Mit a.xsd klappt das Lesen von a.xsd, wobei dann immer noch die include-Anweisung im xsd verbleibt, aber mit einem zweiten Kommando gelöscht werden könnte.)

ciciban

(Themenstarter)

Anmeldungsdatum:
23. Januar 2006

Beiträge: 655

Danke!

Antworten |