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

如何通过XSLT将XML孙节点值提取至Pandas DataFrame

用XSLT配合Pandas的read_xml扁平XML为DataFrame

需求

将指定XML结构扁平化为Pandas DataFrame,把嵌套的ml:dessert/ml:name直接映射为dessert列。

给定XML结构

<ml:Meals xmlns:ml="http://www.food.com">
  <ml:Meal>
    <ml:type>lunch</ml:type>
    <ml:main_course>turkey sandwich</ml:main_course>
    <ml:dessert>
      <ml:name>Cookie</ml:name>
    </ml:dessert>
  </ml:Meal>
</ml:Meals>

期望的DataFrame

+-----+---------------+-------+
| type|    main_course|dessert|
+-----+---------------+-------+
|lunch|turkey sandwich| Cookie|
+-----+---------------+-------+

原错误XSLT代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  xmlns:ml="http://www.food.com">
  
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="*[@ml:dessert]">
        <xsl:copy>
            <xsl:value-of select="@ml:name"/>
        </xsl:copy>
    </xsl:template>
  
</xsl:stylesheet>

错误分析

  1. 匹配规则*[@ml:dessert]错误:ml:dessert是元素而非属性,应直接匹配ml:dessert元素本身。
  2. 取值@ml:name错误:ml:name是子元素而非属性,需用ml:name/text()获取文本内容。
  3. 模板逻辑未正确保留dessert元素名并替换嵌套内容。

修正后的XSLT代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ml="http://www.food.com">
  
  <!-- 身份模板:默认复制所有节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  
  <!-- 匹配ml:dessert元素,替换为同名元素,内容取子元素ml:name的文本 -->
  <xsl:template match="ml:dessert">
    <ml:dessert>
      <xsl:value-of select="ml:name"/>
    </ml:dessert>
  </xsl:template>
  
</xsl:stylesheet>

Python代码示例

import pandas as pd

# 读取XML并应用修正后的XSLT
df = pd.read_xml(
    "meals.xml",  # 你的XML文件路径
    stylesheet="flatten.xslt"  # 修正后的XSLT文件路径
)

print(df)

运行后即可得到期望的扁平DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:12:50