怎么把一个扁平的XML结构转换成嵌套结构 XSLT教程
技术百科
畫卷琴夢
发布时间:2026-01-04
浏览: 次 扁平XML靠属性(如parentId)隐含父子关系,嵌套结构用标签包裹实现层级;XSLT通过key()索引子节点并递归模板将扁平数据转为嵌套树形结构。
理解扁平XML和嵌套结构的区别
扁平XML通常指所有元素都在同一层级,靠属性(如 id、parentId)隐含父子关系,比如菜单项、组织架构或树形数据。嵌套结构则是用实际的父子标签包裹,比如 。XSLT 的核心任务就是根据 parentId(或类似字段
)把“散装”的节点组装成树。
关键:用 key() 和递归模板匹配父子关系
XSLT 不支持循环建树,必须靠递归。先用 key() 快速索引子节点,再用模板调用自身处理后代。
- 定义 key:
(假设每个item有@parentId) - 从根节点开始(例如
@parentId = ''或@parentId = '0'或不存在): - 在 item 模板里,用
key('children', @id)找出所有直接子节点,并递归应用模板
一个可运行的简化示例
输入(扁平):
输出(嵌套):
对应 XSLT 片段(XSLT 1.0):
注意事项和常见坑
- 确保 parentId 值与父节点的 id 完全一致(包括空字符串、'0'、null 表示根 —— 需统一判断)
- XSLT 1.0 不支持
current()在 key 中动态计算,所以 key 必须基于原始属性值建立 - 如果存在环(比如 A 的 parentId 是 B,B 的 parentId 是 A),会无限递归 —— 生产环境建议加深度限制或预检
- 想保留原始顺序?key 返回节点集默认无序,用
select="item[@parentId = $id]"替代 key 可维持文档顺序(但性能略低)
# 首页
# 则是
# 文档
# 菜单项
# 组织架构
# app
# 不支持
# 先用
# 再用
# http
# 循环
# 递归
# 区别
# xml
# 字符串
# 架构
# NULL
# select
# transform
# 或不
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11如何设置ipv6 Win11开启IPv6
- 如何使用Golang log记录不同级别日志_Go
- Windows10怎么查看硬件信息_Windows
- c++中explicit(bool)的用法 c++
- PHP主流架构如何处理会话管理_Session与C
- VSC里PHP变量未定义报错怎么解决_错误抑制技巧
- php8.4如何配置ssl证书_php8.4htt
- windows 10专注助手怎么关闭_window
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11怎么关闭通知消息_屏蔽Windows 1
- 如何在Golang中实现微服务负载均衡_Golan
- php8.4如何实现队列任务_php8.4redi
- Drupal 中 HTML 链接被重复转义导致渲染
- Win11怎么更改鼠标指针方案_Windows11
- 如何在Golang中实现邮件发送功能_Golang
- LINUX如何查看文件类型_Linux中file命
- Win10怎么卸载剪映_Win10彻底卸载剪映方法
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- 如何将竖排文本文件转换为横排字符串
- Python列表推导式与字典推导式教程_简化代码高
- Win11怎么设置组合键快捷方式_Windows1
- 如何高效获取循环末次生成的 NumPy 数组最后一
- 如何在 Go 中可靠地测试含 time.Time
- Bpmn 2.0的XML文件怎么画流程图
- 如何在 VS Code 中正确配置并使用 NumP
- Win11开始菜单打不开_修复Windows 11
- c++如何使用std::bind绑定函数参数_c+
- Windows10电脑怎么设置电源按钮_Win10
- ACF 教程:正确更新嵌套在多层 Group 字段
- Win10如何更改网络连接_Windows10以太
- VSC怎么在PHP中调试MySQL_数据库交互排查
- 如何使用Golang实现容器安全扫描_Golang
- 用lighttpd能运行php吗_lighttpd
- Win11怎么设置桌面图标间距_Windows11
- Python包结构设计_大型项目组织解析【指导】
- 如何在Golang中实现RPC异步返回_Golan
- Win10电脑C盘红了怎么清理_Windows10
- php打包exe如何加密代码_防反编译保护方法【技
- c++怎么使用std::unique实现去重_c+
- 如何使用Golang实现容器健康检查_监控和自动重
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Windows如何使用注册表查找和删除项?(reg
- Windows怎样关闭开始菜单推荐广告_Windo
- Win11怎么设置多显示器任务栏 Win11扩展任
- Win11如何关闭游戏模式 Win11禁用Xbox
- Windows10任务栏图标变成白色文件_Win1
- Win11怎么开启HDR模式_Windows 11
- 如何在 Go 中正确反序列化 XML 多节点数组(
- 如何使用Golang包导出规则_控制函数和变量可见

QQ客服