:递归地处理当前节点的所有属性和子节点。
这个模板确保了输入XML中所有未被其他更具体模板匹配的元素和属性都会被原样复制到输出中,从而避免了手动为每个不需要修改的元素编写复制规则。
抑制源位置的Quantity元素
这个模板匹配所有直接位于WarehouseHeader下的Quantity元素。由于模板体为空,当XSLT处理器遇到这些Quantity元素时,不会生成任何输出,从而实现了“删除”或“抑制”这些元素的效果。
移动Quantity元素到WarehouseLine内部
这是实现元素移动的关键模板:
match=”WarehouseLine”:这个模板会匹配输入XML中的每一个WarehouseLine元素。:首先,它会复制当前的WarehouseLine元素本身。:接着,它会复制WarehouseLine元素的所有子元素(例如ItemNo、Description、UnitofMeasureCode)。copy-of会连同子元素、属性等一并复制。:这是最关键的一步。它使用XPath表达式preceding-sibling::Quantity[1]来选择:preceding-sibling:::选择当前节点的紧邻兄弟节点中,位于当前节点之前的节点。Quantity:进一步筛选,只选择名为Quantity的兄弟节点。[1]:从匹配到的Quantity兄弟节点中,选择第一个。由于XPath的preceding-sibling轴是逆序的(从当前节点向前查找),[1]实际上指的是紧邻当前WarehouseLine元素之前的那个Quantity元素。
通过这种方式,每个WarehouseLine元素都能准确地找到并复制其在源文档中紧邻的Quantity值,从而实现了精确的元素移动和关联。
运行效果
将上述XSLT样式表应用于提供的输入XML,将生成以下输出XML,完美符合预期:
RMA-21001 RMA t.b.v. order_id #2 17/11/2021 7890 Radiant Tee-L-Purple PCS 1 RMA-21003 RMA t.b.v. order_id #32 02/12/2021 4560 Strive Shoulder Pack PCS 1 1234 Driven Backpack PCS 8
注意事项与最佳实践
XSLT版本选择:本示例使用的是XSLT 1.0。对于更复杂的转换需求,如分组、多文档处理等,XSLT 2.0或3.0提供了更强大的功能和更简洁的语法。XPath表达式的精确性:XPath是XSLT的核心。理解并编写精确的XPath表达式是成功进行XML转换的关键。特别是处理兄弟节点时,preceding-sibling和following-sibling轴以及谓词(如[1])的使用至关重要。命名空间处理:如果XML文档中使用了命名空间(如本例中的xmlns:ti),在XSLT样式表中也需要正确声明和使用这些命名空间,否则可能无法匹配到相应的元素。调试:对于复杂的XSLT样式表,调试可能具有挑战性。可以使用专门的XSLT调试器或在线XSLT转换工具来逐步执行和检查输出。性能:对于非常大的XML文件,XSLT转换的性能可能成为一个考虑因素。优化XPath表达式、避免不必要的遍历可以提高效率。
总结
通过本教程,我们学习了如何利用XSLT的声明式特性、强大的XPath表达式和模板匹配机制,高效且精确地重构XML数据结构。相较于过程式编程方法,XSLT在处理此类XML转换任务时展现出更高的灵活性和可维护性,尤其适用于需要根据复杂规则调整XML层级关系的场景。掌握XSLT能够显著提升XML数据处理的效率和质量。
以上就是XML元素重构:利用XSLT实现精确层级调整的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1333367.html
微信扫一扫
支付宝扫一扫