2016-04-12 14 views
1

Ich versuche, zwei XML-Dateien zusammenzuführen, indem ich den Wert eines Attributs abgleiche. XML-Dateien stammen von MySQL-Abfragen mit der Ausgabe '--xml'.merge xml passender Attributwert

file1.xml

<?xml version="1.0"?> 
<resultset statement="SELECT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<row> 
    <field name="ID_editore">20</field> 
    <field name="nome">Name1</field> 
    <field name="biografia">Bib1</field> 
    <field name="autoricat"></field> 
</row> 
<row> 
    <field name="ID_editore">21</field> 
    <field name="nome">Name2</field> 
    <field name="biografia">Bib2</field> 
    <field name="autoricat">text2</field> 
</row> 
</resultset> 

file2.xml

<?xml version="1.0"?> 
<resultset statement="SELECT" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<row> 
    <field name="editore_ID">20</field> 
    <field name="data">1929</field> 
    <field name="indirizzo">Address 1</field> 
</row> 
<row> 
    <field name="editore_ID">21</field> 
    <field name="data">1950</field> 
    <field name="indirizzo">Address 2</field> 
</row> 
</resultset> 

Wunsch Merge:

<?xml version="1.0"?> 
<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" statement="SELECT"> 
<row> 
    <field name="ID_editore">20</field> 
    <field name="nome">Name1</field> 
    <field name="biografia">Bib1</field> 
    <field name="autoricat"/> 
    <field name="data">1929</field> 
    <field name="indirizzo">Address 1</field> 
</row> 
<row> 
    <field name="ID_editore">21</field> 
    <field name="nome">Name2</field> 
    <field name="biografia">Bib2</field> 
    <field name="autoricat">text2</field> 
    <field name="data">1950</field> 
    <field name="indirizzo">Address 2</field> 
</row> 
</resultset> 

Mit folgendem Sheet ich das falsche Ergebnis zu bekommen, weil ich nicht weiß, wie die richtigen Attributwerte übereinstimmen:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes" omit-xml-declaration="yes"/> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="row"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* | node()" /> 

    <xsl:copy-of select="document('file2.xml') 
      /resultset/row/field[(@name='editore_ID')=current()[@name='ID_editore']]"/> 

    </xsl:copy> 
</xsl:template> 

</xsl:stylesheet> 

Wrong Ergebnis mit über Sheet:

<?xml version="1.0"?> 
<resultset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" statement="SELECT"> 
<row> 
    <field name="ID_editore">20</field> 
    <field name="nome">Name1</field> 
    <field name="biografia">Bib1</field> 
    <field name="autoricat"/> 
    <field name="data">1929</field> 
    <field name="indirizzo">Address 1</field> 
    <field name="data">1950</field> 
    <field name="indirizzo">Address 2</field> 
    </row> 
    <row> 
    <field name="ID_editore">21</field> 
    <field name="nome">Name2</field> 
    <field name="biografia">Bib2</field> 
    <field name="autoricat">text2</field> 
    <field name="data">1929</field> 
    <field name="indirizzo">Address 1</field> 
    <field name="data">1950</field> 
    <field name="indirizzo">Address 2</field> 
    </row> 
    </resultset> 

ich diesen Befehl ausführen, um die Ausgabe

xsltproc stylesheet.xsl file1.xml 

Antwort

0

Sie können versuchen, erhalten mit dem folgenden XPath-Ausdruck in Ihrem xsl:copy-of:

document('file2.xml.xml') 
    /resultset 
    /row 
    /field[ 
     @name='editore_ID' and .=current()/field[@name='ID_editore'] 
    ] 
    /following-sibling::field 

Der XPath findet zuerst editore_ID welcher Wert matche s aktuelle ID_editore, und gibt dann alle folgenden Geschwister field Elemente zurück (so dass die editore_ID selbst nicht in die Ausgabe XML kopiert wird).

+0

danke! es funktioniert perfekt. – brace

Verwandte Themen