如何通过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>
错误分析
- 匹配规则
*[@ml:dessert]错误:ml:dessert是元素而非属性,应直接匹配ml:dessert元素本身。 - 取值
@ml:name错误:ml:name是子元素而非属性,需用ml:name/text()获取文本内容。 - 模板逻辑未正确保留
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
相关产品推荐
相关产品推荐

