0

0

动态生成XSLT用于不同XML映射

月夜之吻

月夜之吻

发布时间:2026-02-26 10:50:03

|

269人浏览过

|

来源于php中文网

原创

不能直接用字符串拼接生成xslt,因其是严格格式的xml,需用elementtree或xdocument等api自动处理命名空间、转义和属性归一。

动态生成xslt用于不同xml映射

为什么不能直接用字符串拼接生成 XSLT

因为 XSLT 是 XML,而 XML 对命名空间、属性顺序、转义字符、空格敏感度极其严格。用 str.replace()f-string 拼接,极易产出格式错误的 XSLT(比如未转义 & 变成 &,或 xmlns 位置错乱),导致 XsltCompiler.Compile()XsltException: Invalid token 或运行时静默失败。

真正安全的方式是用 XML 构建 API(如 Python 的 xml.etree.ElementTree 或 C# 的 XDocument)生成结构,再序列化为字符串——它自动处理命名空间声明、属性归一、文本转义。

Python 中用 ElementTree 动态构建 XSLT 模板

核心思路:先构造根节点 <stylesheet></stylesheet>,显式添加命名空间;再逐层追加 <template></template><value-of></value-of> 等元素;最后用 ET.tostring() 输出,并指定 encoding="unicode" 避免字节串干扰。

  • ET.register_namespace("xsl", "https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad") 必须调用,否则前缀不识别
  • 所有子元素必须用 ET.SubElement(parent, tag, attrib={}) 创建,不能用 parent.append(ET.Element(...)),否则命名空间丢失
  • 动态字段(如源路径 customer/name)应作为 select 属性值注入,而非硬编码在标签内
import xml.etree.ElementTree as ET
<p>ET.register_namespace("xsl", "<a href="https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad">https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad</a>")
root = ET.Element("{<a href="https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}stylesheet">https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}stylesheet</a>", version="1.0")</p><p>template = ET.SubElement(root, "{<a href="https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}template">https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}template</a>", match="/")
value = ET.SubElement(template, "{<a href="https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}value-of">https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad}value-of</a>", select="customer/name")</p><p>xslt_str = ET.tostring(root, encoding="unicode")
print(xslt_str)

如何支持多层级映射与条件逻辑

真实 XML 映射常含重复节点(order/item)、可选字段(address/zip 可能缺失)、条件转换(金额大于 1000 时加单位)。这些无法靠静态模板覆盖,需在生成阶段注入逻辑节点。

网趣网上购物系统HTML静态版
网趣网上购物系统HTML静态版

网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使

下载
  • 循环用 <for-each></for-each>:动态添加时,select 属性填入运行时路径(如 order/item
  • 判空用 <if test="position"></if>:生成时检查字段是否存在,决定是否插入该节点
  • 条件值转换用 <choose></choose>:例如对 amount 字段,生成 <when test="number(.) > 1000"><value-of select="concat(., ' USD')"></value-of></when>

注意:test 表达式里的 . 指当前上下文节点,生成时不能写死,要根据目标字段动态计算 XPath 上下文深度。

C# 中用 XDocument 生成并验证 XSLT

.NET 生态更推荐 XDocument,它原生支持命名空间前缀绑定,且可直接加载进 XslCompiledTransform 验证语法。关键点是:必须用 XNamespace 声明命名空间,并在所有元素名前拼接;XAttributename 参数也需带命名空间(如 xsl + "version")。

生成后建议立即调用 transform.Load(xdoc.CreateReader()),捕获 XsltException——这是唯一能提前发现命名空间漏声明、闭合标签错位等低级错误的方法。

XNamespace xsl = "https://www.php.cn/link/b923dbd86db34a1294e93af71efb59ad";
var doc = new XDocument(
    new XElement(xsl + "stylesheet",
        new XAttribute(xsl + "version", "1.0"),
        new XElement(xsl + "template",
            new XAttribute("match", "/"),
            new XElement(xsl + "value-of",
                new XAttribute("select", "customer/id")
            )
        )
    )
);
<p>var transform = new XslCompiledTransform();
transform.Load(doc.CreateReader()); // 此处抛异常即说明生成有误

XSLT 动态生成最易被忽略的是命名空间作用域:同一个 xsl: 前缀在不同嵌套层级中,其绑定的 URI 必须完全一致,且父元素声明必须覆盖子元素——手动拼字符串时根本没法保证这点。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

850

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

830

2023.08.22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1936

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2109

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1137

2024.11.28

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6461

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

838

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1087

2023.12.21

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

329

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号