使用XSL遍历多层XML并生成竖线分隔文本的技术求助
解决XSL遍历XML生成竖线分隔文本的瓶颈
嘿,作为XSL新手遇到这种遍历+文本输出的问题太正常了!我来帮你拆解需求,给出可直接复用的解决方案,顺便解释关键知识点,帮你快速上手~
先补全你的XML测试示例
你给出的XML片段不完整,我先补全成包含员工及家属的完整结构,方便后续测试:
<?xml version="1.0" encoding="UTF-8"?> <DATA_DS> <Parent_Group> <Employee_Traversal_Record> <Employee_1_Child_Group> <Employee_1_Detail_Record> <Employee_Number>12345</Employee_Number> <Employee_Name>John Doe</Employee_Name> <Department>Engineering</Department> </Employee_1_Detail_Record> <Dependents_Group> <Dependent_Detail_Record> <Dependent_Name>Jane Doe</Dependent_Name> <Relationship>Spouse</Relationship> <Age>32</Age> </Dependent_Detail_Record> <Dependent_Detail_Record> <Dependent_Name>Jimmy Doe</Dependent_Name> <Relationship>Child</Relationship> <Age>8</Age> </Dependent_Detail_Record> </Dependents_Group> </Employee_1_Child_Group> </Employee_Traversal_Record> </Parent_Group> </DATA_DS>
适配你需求的XSLT模板
下面是一个完整的XSL 1.0模板,专门用来处理你的XML结构,生成竖线分隔的纯文本输出:
<?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="text" encoding="UTF-8" indent="no"/> <!-- 匹配XML根节点,开始处理逻辑 --> <xsl:template match="/"> <!-- 可选:输出表头行,方便后续导入表格工具 --> <xsl:text>Employee_Number|Employee_Name|Department|Dependent_Name|Relationship|Age </xsl:text> <!-- 遍历每一组员工信息 --> <xsl:for-each select="DATA_DS/Parent_Group/Employee_Traversal_Record/Employee_1_Child_Group"> <!-- 保存员工基础信息到变量,避免重复查询节点 --> <xsl:variable name="empNumber" select="Employee_1_Detail_Record/Employee_Number"/> <xsl:variable name="empName" select="Employee_1_Detail_Record/Employee_Name"/> <xsl:variable name="empDept" select="Employee_1_Detail_Record/Department"/> <!-- 遍历该员工的所有家属,生成对应行 --> <xsl:for-each select="Dependents_Group/Dependent_Detail_Record"> <xsl:value-of select="$empNumber"/> <xsl:text>|</xsl:text> <xsl:value-of select="$empName"/> <xsl:text>|</xsl:text> <xsl:value-of select="$empDept"/> <xsl:text>|</xsl:text> <xsl:value-of select="Dependent_Name"/> <xsl:text>|</xsl:text> <xsl:value-of select="Relationship"/> <xsl:text>|</xsl:text> <xsl:value-of select="Age"/> <!-- 添加换行符(Unix风格,Windows用 ) --> <xsl:text> </xsl:text> </xsl:for-each> <!-- 处理无家属的情况:生成仅含员工信息的行 --> <xsl:if test="not(Dependents_Group/Dependent_Detail_Record)"> <xsl:value-of select="$empNumber"/> <xsl:text>|</xsl:text> <xsl:value-of select="$empName"/> <xsl:text>|</xsl:text> <xsl:value-of select="$empDept"/> <xsl:text>|</xsl:text> <xsl:text>|</xsl:text> <xsl:text>|</xsl:text> <xsl:text> </xsl:text> </xsl:if> </xsl:for-each> </xsl:template> </xsl:stylesheet>
关键知识点解析
<xsl:output method="text">:这是生成纯文本输出的核心,它会告诉XSL处理器不要输出XML标签,只输出你指定的文本内容。- 变量复用:用
<xsl:variable>存储员工的基础信息,避免在遍历家属时重复查询员工节点,既提高效率又让代码更简洁。 - 空值处理:通过
<xsl:if test="not(...)">判断员工是否有家属,确保即使没有家属也能输出格式统一的行。 - 换行符控制:
代表Unix系统的换行符,如果需要适配Windows系统,换成 即可。
最终输出效果
运行上面的XSLT后,你会得到如下竖线分隔的文本:
Employee_Number|Employee_Name|Department|Dependent_Name|Relationship|Age 12345|John Doe|Engineering|Jane Doe|Spouse|32 12345|John Doe|Engineering|Jimmy Doe|Child|8
如果你的XML结构和示例有差异(比如字段名称不同、家属节点路径不一样),只需要调整XSLT里的select路径和输出的字段顺序即可,非常灵活~
内容的提问来源于stack exchange,提问作者Techie Wiz
相关产品推荐
相关产品推荐

