2017-04-26 9 views
0

Ich habe eine ziemlich große XML-Datei, die ich in ms-access wiederherstellen möchte. Hier ist die Struktur (in Minima natürlich):XSLT UM EINE XML-DATEI IN MS-ACCESS AUFZUNEHMEN

<?xml version="1.0" encoding="UTF-8"?> 
 
<PortfoliosNA> 
 
    <TourOp id="xxx-245-AF"> 
 
    <Company>ITS</Company> 
 
    <joined="11-01-2004" /> 
 
    </TourOp> 
 
    <TourOp id="xxx-342-EU"> 
 
    <Company>TUI</Company> 
 
    <joined="12-03-2004" /> 
 
    </TourOp>   
 
    
 
    <transfer Local="1001 Nuits Travel" HQ="Cairo" RefTO="xxx-245-AF"> 
 
\t <Bus>112</Bus> 
 
\t <AgentsLoc>17</AgentsLoc> 
 
\t <TOleader>4</TOleader> 
 
\t <Circuits>Charm-Hurghada</Circuits> 
 
    </transfer> 
 
    <transfer Local="Alpha Tours" HQ="Bratisla." RefTO="xxx-342-EU"> 
 
\t <Bus>42</Bus> 
 
\t <AgentsLoc>4</AgentsLoc> 
 
\t <TOleader>2</TOleader> 
 
\t <Circuits>xxx</Circuits> 
 
    </transfer> 
 
</PortfoliosNA>

und ich versuche, diese XML in das zu verwandeln:

<PortfoliosNA> 
    <transfer> 
    <Local>1001 Nuits Travel</Local> 
    <HQ>Cairo</HQ> 
    <RefTO>ITS</RefTO> 
    <Bus>112</Bus> 
    <AgentsLoc>17</AgentsLoc> 
    <TOleader>4</TOleader> 
    <Circuits>Charm-Hurghada</Circuits> 
    </transfer> 
    <transfer> 
    <Local>Alpha Tours</Local> 
    <HQ>Bratisla.</HQ> 
    <RefTO>TUI</RefTO> 
    <Bus>42</Bus> 
    <AgentsLoc>4</AgentsLoc> 
    <TOleader>2</TOleader> 
    <Circuits>xxx</Circuits> 
    </transfer> 
</PortfoliosNA> 

Wie Sie RefTO Knoten sehen nehmen der Firmenname Wert anstelle der ID ('ITS' anstelle von 'xxx-245-AF' für ex.) So schließlich werde ich eine eindeutige Tabelle in ms-Zugriff namens 'Transfer' mit 7 Spalten (Local-HQ- RefTO-Bus-Agenten-TOLader-Schaltungen)

Ich könnte eine lesbare Tabelle mit einer XSLT-Transformationsdatei haben, aber ich bin immer noch weit entfernt von einer funktionierenden Tabelle und konnte absolut nicht den Firmennamen als Wert für 'RefTO' anstelle von Its ID erhalten. Hier ist meine XSLT-Datei:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
<xsl:output method="xml" indent="yes"/> 

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

<xsl:template match="transfer/@*"> 
<xsl:element name="{name()}"> 
    <xsl:value-of select="."/> 
</xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

ist so dankbar für jede Hilfe aus diesem Alptraum zu bekommen und meine Abschlussberichte zu produzieren. Vielen Dank.

Antwort

1

es auf diese Weise versuchen:

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="op" match="TourOp" use="@id"/> 

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

<xsl:template match="/PortfoliosNA"> 
    <xsl:copy> 
     <xsl:apply-templates select="transfer"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="transfer/@*"> 
    <xsl:element name="{name()}"> 
     <xsl:value-of select="."/> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="transfer/@RefTO"> 
    <RefTO> 
     <xsl:value-of select="key('op', .)/Company"/> 
    </RefTO> 
</xsl:template> 

</xsl:stylesheet> 

Um zu verstehen, wie das funktioniert, lesen: https://www.xml.com/pub/a/2002/02/06/key-lookups.html

+0

OMG wie ein Zauber! Vielen Dank für die Rettung meines Lebens heute und danke für den Link. Ich werde dorthin springen, um den Mechanismus besser zu verstehen und den nächsten ähnlichen Bedürfnissen zu begegnen. Xml ist nicht wirklich mein "Glück", aber ich muss. – karmel

Verwandte Themen