【问题标题】:Importing a XML file in MS Access在 MS Access 中导入 XML 文件
【发布时间】:2016-10-27 10:23:25
【问题描述】:

我正在尝试创建一个 XSLT 文件(XML 转换文件)以在 MS Access 中导入此 XML,有人可以帮助我吗?

我不知道样式表, 我尝试创建一个,但它没有根据需要显示每个导入表中的 QUOTATION NUMBERDATE 值...

>>>

<?xml version="1.0" encoding="UTF-8"?>
<BRAND_QUOTES xmlns:xalan="http://xml.apache.org/xalan" xmlns:java="http://xml.apache.org/xslt/java" xmlns:brand="http://brand" RECEIVER_ID="0000112233" SENDER_ID="888800000008">
  <QUOTATION NUMBER="1919999999" DATE="20170208" TREATMENT="Back Margin" DIRECT_BACK_REBATE_APPLY="TRUE">
    <PARTY_DETAILS ROLE="SOLD_TO">
      <ID TYPE="GLN">0000119379</ID>
      <CONTACT_DETAILS>
        <NAME>TDC SPA</NAME>
        <STREET>R. PERSATTE</STREET>
        <COUNTRY>FR</COUNTRY>
        <POSTCODE>25687</POSTCODE>
        <PHONE>002996644</PHONE>
      </CONTACT_DETAILS>
    </PARTY_DETAILS>
    <PARTY_DETAILS ROLE="INDIRECT_CUSTOMER">
      <CONTACT_DETAILS>
        <NAME>JEANPIERRE PORRET</NAME>
        <VAT>FR00256893364</VAT>
      </CONTACT_DETAILS>
    </PARTY_DETAILS>
    <PARTY_DETAILS ROLE="SALES_EMPLOYEE">
      <CONTACT_DETAILS>
        <NAME>Marta Rossi</NAME>
      </CONTACT_DETAILS>
    </PARTY_DETAILS>
    <PARTY_DETAILS ROLE="FINAL_CUSTOMER">
      <CONTACT_DETAILS>
        <NAME>CRISTIANO MOHAMED</NAME>
      </CONTACT_DETAILS>
    </PARTY_DETAILS>
    <DATE TYPE="VALID_FROM">20161103</DATE>
    <DATE TYPE="VALID_TO">20201231</DATE>
    <LEGAL_TEXTS>
      <TEXT TYPE="FIXED_TEXT1">Faisant suite à notre dernier entretien,nous avons le plaisir de vous transmettre ci-dessous nos conditions pour cette affaire</TEXT>
      <TEXT TYPE="AUTO_TEXT">Le chiffre d'affaire réalisé sur cette cotation ne sera pas intégrédans  la base de calcul des bonus contractuels.</TEXT>
      <TEXT TYPE="FIXED_TEXT2">Cette offre est valable dans la limite des stocks disponibles et sous réserve de modification de prix de notre part, aux Conditions deréglements contractuelles, Nous vous prions d'identifier vos commandesavec la mention "Affaires Spéciales" en reportant le numéro decotation et le code marché et de joindre les justificatifs descommandes clients ,Nous souhaitons que ces conditions vous permettentde donner une suite favorable à cette affaire, Dans l'attente , nousvous prions de croire en l'assurance de notre considérationdistinguée.</TEXT>
      <TEXT TYPE="HEADER_TEXT" />
    </LEGAL_TEXTS>
    <LINE_ITEMS>
      <ITEM>
        <PRODUCT_CODE TYPE="BRAND">C11CD47301</PRODUCT_CODE>
        <PRODUCT_CODE TYPE="EAN">8715946552071</PRODUCT_CODE>
        <DESCRIPTION>Tablet 20"</DESCRIPTION>
        <QUANTITY TYPE="MINQTY" UNIT="PCE">20.0000000000</QUANTITY>
        <QUANTITY TYPE="MAXQTY" UNIT="PCE">20.0000000000</QUANTITY>
        <QUANTITY TYPE="MINORDQTY" UNIT="PCE">0</QUANTITY>
        <PRICE TYPE="DIRECT">300.0000</PRICE>
        <PRICE TYPE="INDIRECT" />
        <PRICE TYPE="FINAL" />
        <CURRENCY>EUR</CURRENCY>
        <CATEGORY TYPE="1">0B</CATEGORY>
      </ITEM>
      <ITEM>
        <PRODUCT_CODE TYPE="BRAND">F11J115142AB</PRODUCT_CODE>
        <PRODUCT_CODE TYPE="EAN">8715555111333</PRODUCT_CODE>
        <DESCRIPTION>EMP-7773 VIDEOPROJECTOR</DESCRIPTION>
        <QUANTITY TYPE="MINQTY" UNIT="PCE">10.0000000000</QUANTITY>
        <QUANTITY TYPE="MAXQTY" UNIT="PCE">10.0000000000</QUANTITY>
        <QUANTITY TYPE="MINORDQTY" UNIT="PCE">0</QUANTITY>
        <PRICE TYPE="DIRECT">1500.0000</PRICE>
        <PRICE TYPE="INDIRECT" />
        <PRICE TYPE="FINAL" />
        <CURRENCY>EUR</CURRENCY>
        <CATEGORY TYPE="1">51</CATEGORY>
      </ITEM>
    </LINE_ITEMS>
  </QUOTATION>
</BRAND_QUOTES>

XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<BRAND_QUOTES xmlns:xalan="http://xml.apache.org/xalan" xmlns:java="http://xml.apache.org/xslt/java" xmlns:brand="http://brand" RECEIVER_ID="0000208712" SENDER_ID="1113214000020">
    <QUOTATION NUMBER="7001234567" DATE="20161025">
        <PARTY_DETAILS ROLE="SOLD_TO">
            <ID TYPE="GLN">0000208712</ID>
            <CONTACT_DETAILS>
                <NAME>CONCORD S.R.L.</NAME>
                <STREET>VIA GIGLI, 14</STREET>
                <COUNTRY>IT</COUNTRY>
                <POSTCODE>00118</POSTCODE>
                <PHONE>06/12345678</PHONE>
            </CONTACT_DETAILS>
        </PARTY_DETAILS>
        <PARTY_DETAILS ROLE="INDIRECT_CUSTOMER">
            <CONTACT_DETAILS>
                <NAME>FOX SRL</NAME>
                <VAT>IT01477465457</VAT>
            </CONTACT_DETAILS>
        </PARTY_DETAILS>
        <PARTY_DETAILS ROLE="SALES_EMPLOYEE">
            <CONTACT_DETAILS>
                <NAME>Mario Rossi</NAME>
            </CONTACT_DETAILS>
        </PARTY_DETAILS>
        <PARTY_DETAILS ROLE="CONTACT_PERSON">
            <CONTACT_DETAILS>
                <NAME>UFFICIO BID</NAME>
            </CONTACT_DETAILS>
        </PARTY_DETAILS>
        <PARTY_DETAILS ROLE="FINAL_CUSTOMER">
            <CONTACT_DETAILS>
                <NAME>WAST SPA</NAME>
            </CONTACT_DETAILS>
        </PARTY_DETAILS>
        <DATE TYPE="VALID_FROM">20161011</DATE>
        <DATE TYPE="VALID_TO">20170331</DATE>
        <LEGAL_TEXTS>
            <TEXT TYPE="FIXED_TEXT1">Faisant suite à notre dernier entretien,nous avons le plaisir de vous transmettre ci-dessous nos conditions pour cette affaire</TEXT>
            <TEXT TYPE="AUTO_TEXT">Le chiffre d'affaire réalisé sur cette cotation ne sera pas intégrédans  la base de calcul des bonus contractuels.</TEXT>
            <TEXT TYPE="FIXED_TEXT2">Cette offre est valable dans la limite des stocks disponibles et sous réserve de modification de prix de notre part, aux Conditions deréglements contractuelles, Nous vous prions d'identifier vos commandesavec la mention "Affaires Spéciales" en reportant le numéro decotation et le code marché et de joindre les justificatifs descommandes clients ,Nous souhaitons que ces conditions vous permettentde donner une suite favorable à cette affaire, Dans l'attente , nousvous prions de croire en l'assurance de notre considérationdistinguée.</TEXT>
            <TEXT TYPE="HEADER_TEXT"/>
        </LEGAL_TEXTS>
        <LINE_ITEMS>
            <ITEM>
                <PRODUCT_CODE TYPE="BRAND">V13H010L60</PRODUCT_CODE>
                <PRODUCT_CODE TYPE="EAN">8715946478609</PRODUCT_CODE>
                <DESCRIPTION>Lampe EB-93/95/96W/905/420/425W</DESCRIPTION>
                <QUANTITY TYPE="MINQTY" UNIT="PCE">90.0000000000</QUANTITY>
                <QUANTITY TYPE="MAXQTY" UNIT="PCE">90.0000000000</QUANTITY>
                <QUANTITY TYPE="MINORDQTY" UNIT="PCE">0</QUANTITY>
                <PRICE TYPE="DIRECT">120.5000</PRICE>
                <PRICE TYPE="INDIRECT">130.0000</PRICE>
                <PRICE TYPE="FINAL"/>
                <CURRENCY>EUR</CURRENCY>
            </ITEM>
            <ITEM>
                <PRODUCT_CODE TYPE="BRAND">V13H010L78</PRODUCT_CODE>
                <PRODUCT_CODE TYPE="EAN">8715946531045</PRODUCT_CODE>
                <DESCRIPTION>Lampe EB-SXW03/SXW18/X24</DESCRIPTION>
                <QUANTITY TYPE="MINQTY" UNIT="PCE">70.0000000000</QUANTITY>
                <QUANTITY TYPE="MAXQTY" UNIT="PCE">70.0000000000</QUANTITY>
                <QUANTITY TYPE="MINORDQTY" UNIT="PCE">0</QUANTITY>
                <PRICE TYPE="DIRECT">85.6600</PRICE>
                <PRICE TYPE="INDIRECT">92.0000</PRICE>
                <PRICE TYPE="FINAL"/>
                <CURRENCY>EUR</CURRENCY>
            </ITEM>
            <ITEM>
                <PRODUCT_CODE TYPE="BRAND">V13H010L88</PRODUCT_CODE>
                <PRODUCT_CODE TYPE="EAN">8715946546049</PRODUCT_CODE>
                <DESCRIPTION>Lampe EB-9xxH/SX27/W29</DESCRIPTION>
                <QUANTITY TYPE="MINQTY" UNIT="PCE">50.0000000000</QUANTITY>
                <QUANTITY TYPE="MAXQTY" UNIT="PCE">50.0000000000</QUANTITY>
                <QUANTITY TYPE="MINORDQTY" UNIT="PCE">0</QUANTITY>
                <PRICE TYPE="DIRECT">78.6000</PRICE>
                <PRICE TYPE="INDIRECT">82.0000</PRICE>
                <PRICE TYPE="FINAL"/>
                <CURRENCY>EUR</CURRENCY>
            </ITEM>
        </LINE_ITEMS>
    </QUOTATION>
</BRAND_QUOTES>

XSLT 文件:

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

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

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

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

    <xsl:template match="CONTACT_DETAILS">
        <CONTACT_DETAILS>
            <QUOTATION><xsl:value-of select="../../QUOTATION/@NUMBER"/></QUOTATION>
            <xsl:apply-templates select="@*|node()"/>
        </CONTACT_DETAILS>
    </xsl:template>

    <xsl:template match="ITEM">
        <ITEM>
            <QUOTATION><xsl:value-of select="../../QUOTATION/@NUMBER"/></QUOTATION>
            <xsl:apply-templates select="@*|node()"/>
        </ITEM>
    </xsl:template>

    <xsl:template match="LEGAL_TEXTS">
        <LEGAL_TEXTS>
            <QUOTATION><xsl:value-of select="../../QUOTATION/@NUMBER"/></QUOTATION>
            <xsl:apply-templates select="@*|node()"/>
        </LEGAL_TEXTS>
    </xsl:template>

 <xsl:template match="PARTY_DETAILS">
        <PARTY_DETAILS>
            <QUOTATION><xsl:value-of select="../../QUOTATION/@NUMBER"/></QUOTATION>
            <xsl:apply-templates select="@*|node()"/>
        </PARTY_DETAILS>
    </xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 您想要的输出是什么?请编辑问题以更新。

标签: xml ms-access xslt import


【解决方案1】:

由于您使用的是 MS Access,因此您很可能需要标准化的数据库表,此处的共享 ID 为 QUOTATION NUMBERDATE。考虑以下 XSLT,使用ancestor::* 将上述两个节点映射到每个后代。

此外,由于 MS Access 的 XML 导入工具以元素为中心并忽略任何属性,因此我将属性转换为 XSLT 模板中的元素。最后,由于 XML 保持重复的子项 TEXT, PRODUCT_CODE, QUANTITY, PRICE 与数据库的一对多表关系对齐,我合并了一个最终模板来将它们映射到单独的表中:

XSLT

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

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

  <xsl:template match="QUOTATION">
    <xsl:copy>          
      <QUOTATION><xsl:value-of select="@NUMBER"/></QUOTATION>
      <DATE><xsl:value-of select="@DATE"/></DATE>
      <xsl:apply-templates select="*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="PARTY_DETAILS|LEGAL_TEXTS">
    <xsl:copy>
      <QUOTATION>
        <xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@NUMBER"/>
      </QUOTATION>
      <DATE><xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@DATE"/></DATE>
      <xsl:if test="@*">
        <xsl:element name="{local-name(@*)}"><xsl:value-of select="@*"/></xsl:element>
      </xsl:if>
      <xsl:copy-of select="*[local-name()!='TEXT' and local-name()!='CONTACT_DETAILS'
                            and local-name()!='PRODUCT_CODE'
                            and local-name()!='QUANTITY' and local-name()!='PRICE']"/>
      <xsl:apply-templates select="CONTACT_DETAILS|TEXT|PRODUCT_CODE|QUANTITY|PRICE"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="CONTACT_DETAILS">
    <xsl:copy>
      <QUOTATION>
        <xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@NUMBER"/>
      </QUOTATION>
      <DATE><xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@DATE"/></DATE>      
      <xsl:copy-of select="*[local-name()!='VAT']"/>
      <VAT><xsl:value-of select="VAT"/></VAT>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="TEXT">
    <xsl:copy>
      <QUOTATION>
        <xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@NUMBER"/>
      </QUOTATION>
      <DATE><xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@DATE"/></DATE>
      <xsl:if test="@*">
        <xsl:element name="{local-name(@*)}"><xsl:value-of select="@*"/></xsl:element>
      </xsl:if>
      <VALUE><xsl:value-of select="substring(., 1, 255)"/></VALUE>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="ITEM">
    <xsl:copy>
      <QUOTATION>
        <xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@NUMBER"/>
      </QUOTATION>
      <DATE><xsl:value-of select="ancestor::BRAND_QUOTES/QUOTATION/@DATE"/></DATE>
      <xsl:for-each select="*">
        <xsl:if test="@*">
          <xsl:element name="{@*}"><xsl:value-of select="."/></xsl:element>
        </xsl:if>        
      </xsl:for-each>
      <xsl:copy-of select="*[not(@*)]"/>    
     </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

访问 VBA (使用 MSXML,比内置的 TransformXML 更符合 W3C)

Public Sub TransformXMLs()
    ' VBA REFERENCE: MSXML, v6.0
    Dim xmlDoc As New MSXML2.DOMDocument
    Dim xslDoc As New MSXML2.DOMDocument
    Dim newDoc As New MSXML2.DOMDocument

    xmlDoc.Load "C:\Path\To\Source.xml"
    xslDoc.Load "C:\Path\To\Stylesheet.xsl"

    xmlDoc.transformNodeToObject xslDoc, newDoc
    newDoc.Save "C:\Path\To\Output.xml"

    Application.ImportXML "C:\Path\To\Output.xml"

    Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
End Sub

访问表

【讨论】:

  • 请注意:我得到了这个错误表:XML Text Error Message TEXT table, row 3, column VALUE Truncated field
  • MS Access 文本字段最多 255 个字符,因此您可能有一个很长的 TEXT 值。尝试使用 xslt 的 substring(),特别是在 VALUE 节点的最后一个模板中:select=substring(., 1, 255)。这将截断长 XML 节点值。
  • 我必须把 select=substring(., 1, 255) 放在哪里?非常感谢!
  • 我刚刚告诉过你:在 XSLT 的最后一个模板中。替换 &lt;xsl:value-of&gt;&lt;VALUE&gt; 节点中的 select 语句。
  • 我尝试修改 XSLT 的倒数第四行如下: 但错误持续...
猜你喜欢
  • 2017-09-19
  • 2019-12-06
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多