Matthias: Fast identisches Kopieren von xml nach xml

Beitrag lesen

Hallo,

ich habe eine Reihe von DocBook-xml-Dokumenten, die überarbeitet wurden. Dabei wurden revision-attribute verwendet. Da die Überarbeitung nun abgeschlossen ist, möchte ich alle revision-Attribute löschen, damit bei der nächsten Überarbeitung die Dateien nicht zu unübersichtlich werden.

Folgende Schritte soll das .xsl tun:

  • wenn die node weder @revision noch @revisionflag hat, 1:1 kopieren
  • wenn die node @revision='test' und @revisionflag='deleted' hat, nicht übernehmen
  • wenn die node @revision='test' und @revisionflag='added' hat, übernehmen ohne @revision und ohne @revisionflag

Das klappt auch soweit ganz gut, bis auf folgende Probleme:

  1. Ich habe im root-element xmlns:xlink="http://www.w3.org/1999/xlink" angegeben, dieses wird aber nicht im result.xml im root ausgegeben, stattdessen aber in jedem element aus dem Namensraum. Ich häte das aber gerne wieder nur einmal im root.

  2. nodes, die wegen @revisionflag='deleted' nicht ausgegeben werden, generieren eine Leerzeile. Wie kann ich diese unterdrücken?

  3. Bei der Transformation erhalte ich jede Menge warnings:
    Ambiguous rule match for /processing-instruction()[1] Matches  both "processing-instruction()" on line 72 and "node()" on line 19
    Ambiguous rule match for /article[1]/text()[1] Matches both "text()" and "node()" on line 19

Ich bin schon ganz stolz soweit gekommen zu sein, da mir die xsl-Danke immer wieder Probleme bereitet, an den drei Punkten beisse ich mir aber nun die Zähne aus. Kann mir jemand einen Tip geben?

Vielen Dank.

Hier die Quelltexte:

removeRevisions.xml

<?xml version="1.0" encoding="UTF-8"?>  
<?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbook.rng" type="xml"?>  
<article  
    version="5.0"  
    xmlns="http://docbook.org/ns/docbook"  
    xmlns:xlink="http://www.w3.org/1999/xlink">  
    <info>  
        <title>Test</title>  
    </info>  
    <para>Absatz 1.</para>  
    <para  
        revision="test"  
        revisionflag="deleted">Absatz 2.</para>  
    <para  
        revision="test"  
        revisionflag="added">Absatz 3.</para>  
    <para>Absatz 4.</para>  
    <para>Dies ist ein Absatz mit einem <link  
        xlink:href="http://www.google.de">Link</link> auf google.de.</para>  
</article>

removeRevisions.xsl

<?xml version="1.0" encoding="UTF-8"?>  
<xsl:stylesheet  
    version="1.0"  
    xmlns="http://docbook.org/ns/docbook"  
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"  
    xmlns:xlink="http://www.w3.org/1999/xlink"  
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  
  
  
    <xsl:template  
        match="/">  
        <xsl:apply-templates />  
    </xsl:template>  
  
  
  
    <xsl:template  
        match="node()">  
        <xsl:variable  
            name="check">  
            <xsl:choose>  
                <xsl:when  
                    test="attribute::revision = 'test'">  
                    <xsl:choose>  
                        <xsl:when  
                            test="attribute::revisionflag = 'added'">TRUE</xsl:when>  
                        <xsl:otherwise>FALSE</xsl:otherwise>  
                    </xsl:choose>  
                </xsl:when>  
                <xsl:otherwise>TRUE</xsl:otherwise>  
            </xsl:choose>  
        </xsl:variable>  
  
        <xsl:if  
            test="$check = 'TRUE'">  
            <xsl:element  
                name="{name()}">  
                <xsl:for-each  
                    select="attribute::*">  
                    <xsl:choose>  
                        <xsl:when  
                            test="name() = 'revision'" />  
                        <xsl:when  
                            test="name() = 'revisionflag'" />  
                        <xsl:otherwise>  
                            <xsl:attribute  
                                name="{name()}">  
                                <xsl:value-of  
                                    select="." />  
                            </xsl:attribute>  
                        </xsl:otherwise>  
                    </xsl:choose>  
                </xsl:for-each>  
                <xsl:apply-templates />  
            </xsl:element>  
        </xsl:if>  
    </xsl:template>  
  
  
  
    <xsl:template  
        match="text()">  
        <xsl:value-of  
            select="." />  
    </xsl:template>  
  
  
  
    <xsl:template  
        match="processing-instruction()">  
        <xsl:processing-instruction  
            name="{name()}">  
            <xsl:value-of  
                select="." />  
        </xsl:processing-instruction>  
    </xsl:template>  
  
  
  
</xsl:stylesheet>

result.xml

<?xml version="1.0" encoding="utf-8"?><?oxygen RNGSchema="http://www.oasis-open.org/docbook/xml/5.0/rng/docbook.rng" type="xml"?>  
<article  
    version="5.0"  
    xmlns="http://docbook.org/ns/docbook">  
    <info>  
        <title>Test</title>  
    </info>  
    <para>Absatz 1.</para>  
  
    <para>Absatz 3.</para>  
    <para>Absatz 4.</para>  
    <para>Dies ist ein Absatz mit einem <link  
        xlink:href="http://www.google.de"  
        xmlns:xlink="http://www.w3.org/1999/xlink">Link</link> auf google.de.</para>  
</article>