You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:生成可导入MS Access表的多表头XML转XSLT样式表(附示例)

解决多表头XML导入MS Access的XSLT转换方案

我太懂这种卡住的感觉了——把带嵌套子节点的XML转成Access能直接识别的扁平格式,光看论坛帖子确实容易越看越懵。正好你给了完整的示例XML,我直接给你写好对应的XSLT,再拆解每一步的逻辑,你跟着套就行。

首先,先明确我们的目标:把嵌套的MATERIAL_ITEM节点(包括里面的DESCRIPTOR、PART_DETAIL子节点)平铺成一行一条记录的XML格式,这样Access导入的时候就能直接识别成表的行和列。

完整XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 指定输出为缩进格式的XML,方便查看 -->
    <xsl:output method="xml" indent="yes"/>

    <!-- 匹配根节点,开始处理 -->
    <xsl:template match="/INTERFACE_BATCH">
        <root>
            <!-- 循环处理每个物料条目,每个条目对应Access的一行记录 -->
            <xsl:for-each select="MATERIAL_ITEM">
                <row>
                    <!-- 复制MATERIAL_ITEM下的所有直接子节点(比如ERP_NUMBER、MAT_NUMBER这些) -->
                    <xsl:copy-of select="ERP_NUMBER | MAT_NUMBER | PLANT | PROCESS | DELETE | LONG_DES | SHORT_DES | MAT_GROUP | MAT_TYPE | UOM | STORAGE_LOCATION | VALUATION_CLASS | LANGUAGE | REQUESTOR_NAME | REQUESTOR_EMAIL | LAST_UPDATE_BY"/>
                    
                    <!-- 处理DESCRIPTOR里的属性,把每个属性名转成字段名,属性值转成字段值 -->
                    <xsl:for-each select="DESCRIPTOR/DESCRIPTOR_PROPERTIES/DESCRIPTOR_PROPERTY">
                        <xsl:element name="{DESCRIPTOR_PROPERTY_NAME}">
                            <xsl:value-of select="DESCRIPTOR_PROPERTY_VALUE"/>
                        </xsl:element>
                    </xsl:for-each>
                    
                    <!-- 复制PART_DETAIL下的所有子节点,平铺到当前行 -->
                    <xsl:copy-of select="PART_DETAIL/*"/>
                </row>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>

转换后的输出XML(Access可直接导入)

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <row>
      <ERP_NUMBER>E371937</ERP_NUMBER>
      <MAT_NUMBER>M000319339</MAT_NUMBER>
      <PLANT>1AH</PLANT>
      <PROCESS>NORMAL_CREATE</PROCESS>
      <DELETE>N</DELETE>
      <LONG_DES>KIT; TYPE PISTON, APPLICATION ENGINE, COMPRISING PINS; OEM P/N: 1202400Z26ND OEM BB MOTORS, MODEL/MACHINE NO: NISSAN UD460</LONG_DES>
      <SHORT_DES>KIT;PISTON,ENGINE,PINS,1202400Z26ND</SHORT_DES>
      <MAT_GROUP>EAA14</MAT_GROUP>
      <MAT_TYPE>ERSA</MAT_TYPE>
      <UOM>EA</UOM>
      <STORAGE_LOCATION>0011</STORAGE_LOCATION>
      <VALUATION_CLASS>3040</VALUATION_CLASS>
      <LANGUAGE>EN</LANGUAGE>
      <REQUESTOR_NAME>TMAKGETA</REQUESTOR_NAME>
      <REQUESTOR_EMAIL>TMAKGETA@CCBAGROUP.COM</REQUESTOR_EMAIL>
      <LAST_UPDATE_BY>WBEZUIDENHOUT</LAST_UPDATE_BY>
      <APPLICATION>ENGINE</APPLICATION>
      <COMPRISING>PINS</COMPRISING>
      <TYPE>PISTON</TYPE>
      <PART_NO>1202400Z26ND</PART_NO>
      <MANUF>2003476</MANUF>
      <PART_TYPE>OEM</PART_TYPE>
   </row>
</root>

关键逻辑拆解

  1. 根节点匹配与循环:先找到INTERFACE_BATCH根节点,然后循环每个MATERIAL_ITEM——每个循环对应生成Access里的一条记录(<row>节点)。
  2. 平铺直接子节点:用xsl:copy-of直接复制MATERIAL_ITEM下的所有顶级字段,不用逐个写,省事儿。
  3. 处理嵌套属性:DESCRIPTOR里的DESCRIPTOR_PROPERTY是键值对结构,我们用xsl:element name="{DESCRIPTOR_PROPERTY_NAME}"动态生成字段名,把属性值填进去,这样就把嵌套的键值对转成了扁平的字段。
  4. 平铺PART_DETAIL:同样用xsl:copy-of select="PART_DETAIL/*"一次性把所有子节点复制到<row>里,直接平铺。

自定义调整小技巧

  • 如果需要修改字段名(比如把MANUF改成MANUFACTURER),把<xsl:copy-of select="PART_DETAIL/MANUF"/>替换成:
    <MANUFACTURER>
        <xsl:value-of select="PART_DETAIL/MANUF"/>
    </MANUFACTURER>
    
  • 如果有多个MATERIAL_ITEM,这个XSLT会自动生成对应数量的<row>节点,完全支持批量数据。
  • 导入Access时,直接选择转换后的XML文件,Access会自动识别<row>作为记录,每个子元素作为字段。

内容的提问来源于stack exchange,提问作者Gombie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:06:59