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

使用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&#10;</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用&#13;&#10;) -->
        <xsl:text>&#10;</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>&#10;</xsl:text>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

关键知识点解析

  • <xsl:output method="text">:这是生成纯文本输出的核心,它会告诉XSL处理器不要输出XML标签,只输出你指定的文本内容。
  • 变量复用:用<xsl:variable>存储员工的基础信息,避免在遍历家属时重复查询员工节点,既提高效率又让代码更简洁。
  • 空值处理:通过<xsl:if test="not(...)">判断员工是否有家属,确保即使没有家属也能输出格式统一的行。
  • 换行符控制:&#10;代表Unix系统的换行符,如果需要适配Windows系统,换成&#13;&#10;即可。

最终输出效果

运行上面的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:28