2017-04-26 71 views
0

我有一個非常大的xml文件,我想在ms-access中進行恢復。這裏是結構(當然最小值):將XML文件重新創建爲MS-ACCESS的XSLT

<?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>

,我想這個XML轉換成這樣:

<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> 

正如你可以看到RefTO節點將採取公司名稱值而不是Id('ITS'而不是'xxx-245-AF')例如 因此,最後我將在ms-access中獲得一個名爲'transfer'的獨特表格,其中包含7列(Local-HQ- RefTO-Bus-Agents-TOLeader-Circuits)

我可以通過XSLT轉換文件獲得一些可讀表,但我仍然遠離工作表,並且絕對不能將公司名稱作爲'RefTO'的值而不是其ID。 這裏是我的XSLT文件:

<?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> 

很感謝您的幫助來擺脫這種噩夢和產生我的最後報告。謝謝。

回答

1

試試這樣說:

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> 

要理解它是如何工作的,閱讀:https://www.xml.com/pub/a/2002/02/06/key-lookups.html

+0

OMG就像一個魅力!非常感謝你今天挽救我的生命,並感謝你的鏈接。我會跳到那裏去更好地理解機制並面對下一個類似的需求。 Xml並不是我的'快樂',但我必須。 – karmel