求助:生成可导入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>
关键逻辑拆解
- 根节点匹配与循环:先找到
INTERFACE_BATCH根节点,然后循环每个MATERIAL_ITEM——每个循环对应生成Access里的一条记录(<row>节点)。 - 平铺直接子节点:用
xsl:copy-of直接复制MATERIAL_ITEM下的所有顶级字段,不用逐个写,省事儿。 - 处理嵌套属性:
DESCRIPTOR里的DESCRIPTOR_PROPERTY是键值对结构,我们用xsl:element name="{DESCRIPTOR_PROPERTY_NAME}"动态生成字段名,把属性值填进去,这样就把嵌套的键值对转成了扁平的字段。 - 平铺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
相关产品推荐
相关产品推荐

