2016-06-28 7 views
1

私は元々XMLからインポートされたアクセステーブルを持っています。私はそれをエクスポートするとき、私は元のXMLテーブルと同じXML構造を持っていません。VBAを使用したXMLへのアクセステーブルのエクスポート

<?xml version="1.0" standalone="true"?> 
<profiling> 
    <program> 
    <name>118CDSpro</name> 
    <p1on>1</p1on> 
    <p1tool>36</p1tool> 
    <p2on>OFF</p2on> 
    <cut>OFF</cut> 
    <rule>OFF</rule> 
    <desc>118 Clad DirectSet Profile</desc> 
    <pic>akv.bmp</pic> 
    <ten>dilec_F</ten> 
    </program> 
<profiling/> 

これは私が輸出で得るものです::次のように

オリジナルのインポートテーブルには見え

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot generated="2016-06-27T12:16:29" xmlns:od="urn:schemas microsoft-com:officedata"> 
    <Profiling> 
    <name>Din_C92S_pro2</name> 
    <p1on>1</p1on> 
    <p1tool>40</p1tool> 
    <p2on>OFF</p2on> 
    <cut>OFF</cut> 
    <rule>OFF</rule> 
    <desc>Inswing Door Sash Profile 2 (Storm)</desc> 
    <ten>dilec_F</ten> 
    </Profiling> 
</dataroot> 

が、私は問題は.xslファイル内にあると思いますが、私は新しいですどのように使用されているのかわかりません。

このコードは、元の形式に関して非常に具体的です。

ご意見をいただければ幸いです。

オプション2コード:

Sub ProfileXML2() 

    ' RAW XML EXPORT 
    Application.ExportXML acExportTable, "Profiling", "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml" 


    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor) 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL FILES 
    xmlDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfileExport.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\MyData\Crafter 0610\Crafter\MACHINE\SCHEMAS\ProfilingSchema.xsl" 
    xslDoc.async = False 

    ' TRANSFORM SOURCE TO FINAL 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\MyData\Crafter 0610\Crafter\DATA\ProfilingTest.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

End Sub 

答えて

1

は現在、問題はありません。 MS AccessはインポートされたXMLファイル構造を保持しません。受け取る出力は、XML形式の表または照会出力の標準テンプレートです。しかし、あなたの最終用途のニーズはこの生の出力に対応できないので、XML文書を変換するために設計された特別目的の言語XSLTの使用を検討してください。

Application.TransformXMLでXSLTを実行することも、MSXMLライブラリでXSLTを実行することもできます。下のVBAコードは、両方のオプションを示しています。このXSLTは、最初の2つのテンプレートマッチで、ローカル要素名を返す出力からurn:schemas microsoft-com:officedataという名前空間を削除する特別なスクリプトです。

XSLTスクリプト(の.xslがVBAにロードするとして保存)

<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:template match="@*|node()"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:element> 
    </xsl:template> 

    <xsl:template match="text()"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="dataroot">  
    <xsl:apply-templates select="Profiling"/>  
    </xsl:template> 

    <xsl:template match="Profiling"> 
    <profiling> 
     <program> 
     <xsl:apply-templates select="*"/> 
     </program> 
    </profiling> 
    </xsl:template> 

</xsl:stylesheet> 

VBAスクリプト

Public Sub XMLHandle() 

    ' RAW XML EXPORT 
    Application.ExportXML acExportTable, "TableName", "C:\Path\To\Raw\Output.xml" 

    ' TRANSFORM RAW XML (OPTION 1 - limited XSLT method)  
    Application.TransformXML "C:\Path\To\Raw\Output.xml", _ 
          "C:\Path\To\XSLT\Transform.xsl", _ 
          "C:\Path\To\Final\Output.xml" 

    ' TRANSFORM RAW XML (OPTION 2 - full XSLT processor) 
    Dim xmlDoc As Object, xslDoc As Object, newDoc As Object 

    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
    Set xslDoc = CreateObject("MSXML2.DOMDocument") 
    Set newDoc = CreateObject("MSXML2.DOMDocument") 

    ' LOAD XML AND XSL FILES 
    xmlDoc.Load "C:\Path\To\Raw\Output.xml" 
    xmlDoc.async = False 

    xslDoc.Load "C:\Path\To\XSLT\Transform.xsl" 
    xslDoc.async = False 

    ' TRANSFORM SOURCE TO FINAL 
    xmlDoc.transformNodeToObject xslDoc, newDoc 
    newDoc.Save "C:\Path\To\Final\Output.xml" 

    Set newDoc = Nothing 
    Set xslDoc = Nothing 
    Set xmlDoc = Nothing 

End Sub 

出力

<?xml version="1.0" encoding="UTF-8"?> 
<profiling> 
    <program> 
     <name>Din_C92S_pro2</name> 
     <p1on>1</p1on> 
     <p1tool>40</p1tool> 
     <p2on>OFF</p2on> 
     <cut>OFF</cut> 
     <rule>OFF</rule> 
     <desc>Inswing Door Sash Profile 2 (Storm)</desc> 
     <ten>dilec_F</ten> 
    </program> 
</profiling> 
+0

私は両方をテストし、最初のオプションはインデントがないという事実を除いて、XMLデータテーブルに実際には影響しないと私は信じていました。 2番目のオプションでは、「XML文書にはトップレベルの要素が1つしかありません」というエラーが表示されました。最初のオプションがうまくいくので、自分の知識以外には本当に問題になりません。 –

+0

素晴らしい!回答が助けになったら受け入れてください。 2番目のオプションは正しくインデントされます。私はそのエラーを再現することはできません。パスが正しいファイルを指していることを確認してください。 – Parfait

+0

私はまだ回答とコメントの違いを調べようとしています。私はオプション2に関してオリジナルの質問に何かを追加しました。何かが正しくコード化されていないということです。 –

関連する問題