讲师中心 微信公众号
AI工具推荐 视频效率加速

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

秋枫君_1097

秋枫君_1097

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

|

309人浏览过

|

来源于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 时加单位)。这些无法靠静态模板覆盖,需在生成阶段注入逻辑节点。

  • 循环用 <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 声明命名空间,并在所有元素名前拼接;XAttribute 的 name 参数也需带命名空间(如 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工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

更多
string转int
string转int

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

7099

2023.08.02

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

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

4944

2024.04.01

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

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

6417

2024.08.01

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

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

2582

2024.11.28

登录token无效
登录token无效

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

14866

2023.09.14

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

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

1745

2023.09.14

token怎么获取
token怎么获取

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

4137

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

6301

2024.03.01

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn