2014-10-01 50 views
2

我是xml和xsl的新手,所以我會嘗試解釋我的問題。 我有這種類型的XML,它是屬性爲中心的,這些不會導入到Access。如何將屬性數據轉換爲元素數據? 這裏是XML的一部分,我有:如何將屬性xml轉換爲元素xml以便在Access中導入而不丟失數據

<?xml version="1.0" encoding="ISO-8859-1"?> 
<Catalogue version="3.0"> 
<App action="A" id="1"> 
    <BaseVehicle id="1"/> 
    <Note>Use Separate Enclosed Connector</Note> 
    <Note>Slightly longer than original</Note> 
    <Qty>1</Qty> 
    <PartType id="8852"/> 
    <MfrLabel>CleanWipe</MfrLabel> 
    <Position id="104"/> 
    <Part>18CW</Part> 
</App> 
<App action="A" id="2"> 
    <BaseVehicle id="1"/> 
    <BodyType id="6"/> 
    <Note>Use Separate Enclosed Connector</Note> 
    <Qty>1</Qty> 
    <PartType id="8852"/> 
    <MfrLabel>SuperWipe</MfrLabel> 
    <Position id="30"/> 
    <Part>22SW</Part> 
</App> 
</Catalogue> 

這是我用來導入XML到Access 的XSL(我真的不明白它是如何工作的,我發現它在這裏stackflow):

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

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

</xsl:stylesheet> 

問題是我失去了應用程序ID。有沒有一種方法可以在Access中導入這些數據並在一列中添加App ID? 另外我有一個「註釋」行問題,因爲每個「應用程序」有多個註釋行,我無法導入所有註釋行。你有沒有建議如何導入這個XML而不會丟失任何數據? 謝謝大家!

編輯: 這裏是清單在Access導入之後我想到:

ID BaseVehicle注意數量PartType MfrLabel位置部件體形

1比原來的1 8852略長CleanWipe 104 18CW
1 1使用分開的封閉連接器1 8852 CleanWipe 104 18CW
2 1使用獨立的封閉連接器1個8852 SuperWipe 30 22SW 6

或者是這樣的:

ID BaseVehicle注意數量PartType MfrLabel位置部分體形

1 1稍長.. +使用單獨ë.. 1 8852 CleanWipe 104 18CW
2 1使用獨立的封閉連接器1 8852 SuperWipe 30 22SW 6

問題是我不能使它導入列ID和組合筆記或在一個單獨的行中導入非第一筆記...

+0

在這種情況下是否可以顯示您實際期望的輸出?謝謝! – 2014-10-01 13:58:27

+0

可能重複[convert attribute-centric xml to element-centric](http://stackoverflow.com/questions/22445975/convert-attribute-centric-xml-to-element-centric) – 2014-10-01 14:08:17

+0

你好,我補充說我怎麼做期望一個表格看起來像xml被導入時。我也讀過Gord提到的話題,從那篇文章中我拿出了我在這裏寫的xsl。但它並不完全適用於我的問題。 – Skaki 2014-10-02 08:52:57

回答

1

我找到了我的問題的答案。這是我一直在尋找的XSLT:

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

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

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

<xsl:template match="Catalogue/App/Note[1]"> 
    <Note1><xsl:apply-templates select="@*|node()"/></Note1> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[2]"> 
    <Note2><xsl:apply-templates select="@*|node()"/></Note2> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[3]"> 
    <Note3><xsl:apply-templates select="@*|node()"/></Note3> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[4]"> 
    <Note4><xsl:apply-templates select="@*|node()"/></Note4> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[5]"> 
    <Note5><xsl:apply-templates select="@*|node()"/></Note5> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[6]"> 
    <Note6><xsl:apply-templates select="@*|node()"/></Note6> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[7]"> 
    <Note7><xsl:apply-templates select="@*|node()"/></Note7> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[8]"> 
    <Note8><xsl:apply-templates select="@*|node()"/></Note8> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[9]"> 
    <Note9><xsl:apply-templates select="@*|node()"/></Note9> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[10]"> 
    <Note10><xsl:apply-templates select="@*|node()"/></Note10> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[11]"> 
    <Note11><xsl:apply-templates select="@*|node()"/></Note11> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[12]"> 
    <Note12><xsl:apply-templates select="@*|node()"/></Note12> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[13]"> 
    <Note13><xsl:apply-templates select="@*|node()"/></Note13> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[14]"> 
    <Note14><xsl:apply-templates select="@*|node()"/></Note14> 
</xsl:template> 

<xsl:template match="Catalogue/App/Note[15]"> 
    <Note15><xsl:apply-templates select="@*|node()"/></Note15> 
</xsl:template> 

</xsl:stylesheet> 

這樣,所有屬性正在轉化爲元素和所有的「注意」被重複將取決於其在「應用程序」的位置多達15次被重命名元素。但是因爲我知道不會有超過10次的事件發生,所以這會很好。 15只是出於預防措施。 下面是它在轉換之後的樣子:

<?xml version="1.0" encoding="UTF-8"?> 
<Catalogue> 
3.0 
<App> 
    <action>A</action> 
    <id>1</id> 
    <BaseVehicle>1</BaseVehicle> 
    <Note1>Use Separate Enclosed Connector</Note1> 
    <Note2>Slightly longer than original</Note2> 
    <Qty>1</Qty> 
    <PartType>8852</PartType> 
    <MfrLabel>CleanWipe</MfrLabel> 
    <Position>104</Position> 
    <Part>18CW</Part> 
</App> 
<App> 
    <action>A</action> 
    <id>2</id> 
    <BaseVehicle>1</BaseVehicle> 
    <BodyType>6</BodyType> 
    <Note1>Use Separate Enclosed Connector</Note1> 
    <Qty>1</Qty> 
    <PartType>8852</PartType> 
    <MfrLabel>SuperWipe</MfrLabel> 
    <Position>30</Position> 
    <Part>22SW</Part> 
</App> 
</Catalogue> 
+0

我在Access中導入XML時遇到問題,如果您熟悉它,請查看此鏈接:[Access 2007不會導入XML文件中的所有元素數據](http://stackoverflow.com/questions/26272595/access-2007-doesnt-import-all-element-data-from-xml-file) – Skaki 2014-10-09 07:26:43

相關問題