derjuergen: Transformieren von nicht xml Daten

Hallo Forum!

Ich bitte bei folgendem Problem um eure Hilfe.

Ich habe eine Datei, die im wesentlichen aus Elementen besteht, die bis auf eines auch jeweils geschlossen werden.
Es ist ebenfalls kein Root Element vorhanden
und es gibt keine DOCTYPE Deklaration aber Entitys.

Aus dieser Datei möchte ich nun gültiges xml herstellen um im Endeffekt aus diesem eine neue xml-Datei zu erzeugen, bei der ich die Elemente und Inhalte neu ordne.

Wie kann ich dies mit einem XSL-Stylesheet tun; oder geht das gar nicht?

Bsp für ein Ausgangsdokument:

<element1>
 <kind1>text</kind1>
 <kind2>text</kind2>
 <br>
 <kind3>text</kind3>
</element1>
<element2>
 <kind1>text</kind1>
 <kind2>text ä text</kind2>
 <br>
 <kind3>text</kind3>
</element2>

Zwischenziel:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM ".\root.dtd">
<root>
<element1>
 <kind1>text</kind1>
 <kind2>text</kind2>
 <br/>
 <kind3>text</kind3>
</element1>
<element2>
 <kind1>text</kind1>
 <kind2>text ä text</kind2>
 <br/>
 <kind3>text</kind3>
</element2>
</root>

Ziel:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM ".\root.dtd">
<root>
<element1>
 <hallo>textvon kind2</hallo>
 <br/>
</element1>
</root>

Vielen Dank

DerJuergen

  1. Ich habe eine Datei, die im wesentlichen aus Elementen besteht, die bis auf eines auch jeweils geschlossen werden.
    Es ist ebenfalls kein Root Element vorhanden
    und es gibt keine DOCTYPE Deklaration aber Entitys.

    Aus dieser Datei möchte ich nun gültiges xml herstellen um im Endeffekt aus diesem eine neue xml-Datei zu erzeugen, bei der ich die Elemente und Inhalte neu ordne.

    Prinzipell geht das, nur ist der apply von Templates etwas schwierig, weil Deine Elemente element1-elementn heißen. Du müßtest also ein select auf [starts-with(name(node()),'element')] oder so ähnlich setzen

    1. *ist bei seiner Antwort davon ausgegangen, daß du tatsächlich vorher gültiges XML erstellst*

  2. Hi,

    Soweit ich weiß, erfordert XSLT eine wohlgeformte Datei.

    Ich habe eine Datei, die im wesentlichen aus Elementen besteht, die bis auf eines auch jeweils geschlossen werden.

    Das wäre Voraussetzung.

    Es ist ebenfalls kein Root Element vorhanden

    Das ebenfalls.

    und es gibt keine DOCTYPE Deklaration aber Entitys.

    Ein Doctype wäre nicht zwingend erforderlich - aber wenn Entities benutzt werden, müssen diese ja definiert worden sein, also braucht es dann doch einen Doctype.

    Aus dieser Datei möchte ich nun gültiges xml herstellen

    Für diesen Schritt mußt Du meines Wissens eine andere Technik einsetzen (z.B. perl-Script)

    um im Endeffekt aus diesem eine neue xml-Datei zu erzeugen, bei der ich die Elemente und Inhalte neu ordne.

    Das geht dann per XSLT

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
  3. Hallo,

    Im wesentlichen wurde schon an sich alles gesat, deshalb nur einige Ergänzungen:

    Ich habe eine Datei, die im wesentlichen aus Elementen besteht, die bis auf eines auch jeweils geschlossen werden.

    Ab da muss du alles vergessen.
    Egal was du in XML machst Mindestkriterium ist Wohlgeformtheit, auch bei XML-Fragmenten!

    Es ist ebenfalls kein Root Element vorhanden

    Das wäre an sich kein Problem.
    Du könntest dein XML-Fragment  via Entity in eine XML-Datei laden

    <!ENTITY documentfragment SYSTEM "fragment.xml">
    <export-fragment-element>
    &documentfragment;
    </export-fragment-element>

    und es gibt keine DOCTYPE Deklaration aber Entitys.

    Wie gesagt, dann brauchst du zumindest eine DOCTYPE mit einer internen Untermenge.

    Bsp für ein Ausgangsdokument:

    <element1>
    <kind1>text</kind1>
    <kind2>text</kind2>
    <br>
    <kind3>text</kind3>
    </element1>
    <element2>
    <kind1>text</kind1>
    <kind2>text ä text</kind2>
    <br>
    <kind3>text</kind3>
    </element2>

    Das geht nicht mit XSLT, da dieses Fragment nicht wohlgeformt ist (<br>)

    Grüße
    Thomas