xslt中动态生成html标签名和属性名须用xsl:element和xsl:attribute配合avt,标签名如,属性名如,属性值可用avt如class="{@status}",但属性名不可直接avt。

在XSLT中生成动态的HTML标签名和属性名,核心是使用 attribute value template(AVT) 和 xsl:element / xsl:attribute 动态构造节点,不能直接写死标签或属性名。
用 xsl:element 动态生成标签名
当标签名来自XML数据(比如 `xsl:element,不能直接写 `
<xsl:element name="{@type}">
<xsl:value-of select="title"/>
</xsl:element>
假设当前节点有属性 type="article",上面代码就等价于:<article>…</article>。花括号里的表达式会求值,结果作为标签名。
注意:
– 名字必须是合法的XML/HTML标签名(不能含空格、不能以数字开头);
– 如果值为空或非法,XSLT处理器通常报错或忽略;
– 可嵌套使用,比如 <element name="h{position()}"></element> 生成 h1、h2 等。
用 xsl:attribute 动态生成属性名
属性名(如 class、data-id)同样不能硬编码,需用 xsl:attribute 配合 AVT:
立即学习“前端免费学习笔记(深入)”;
<div>
<xsl:attribute name="{@attr-name}">
<xsl:value-of select="@attr-value"/>
</xsl:attribute>
Content
</div>
若 XML 中有 <item attr-name="data-category" attr-value="news"></item>,就会输出:<div data-category="news">Content</div>。
常见组合写法:
- 用
name="{concat('data-', @key)}"拼接前缀 - 用
name="{lower-case(@role)}"统一大小写(XSLT 2.0+) - 配合
xsl:choose控制是否生成某属性(避免空属性)
用 AVT 直接写在静态标签里(仅限属性值,不适用于属性名)
如果只是属性值要动态(如 class="active"),可以直接用花括号:<div class="{@status}"></div> —— 这很常用,但注意:AVT 不能用于属性名本身,下面写法是错误的:
<div {@attr-name}="value"> ❌ 不合法
必须改用 xsl:attribute。
安全与兼容性提醒
动态标签/属性名容易引入 XSS 或结构错误,建议:
- 对来源数据做白名单校验(例如只允许
div、span、data-*类属性名) - XSLT 1.0 不支持函数如
lower-case(),可用translate()替代 -
浏览器原生 XSLT(如旧版 IE)不支持
xsl:element在 HTML 输出模式下的某些行为,建议服务端转换 - 生成自定义元素(如
my-widget)时,确保目标环境支持(现代 HTML 允许,但需 JS 配合)
基本上就这些。关键记住:标签名和属性名要动态 → 必须用 xsl:element 和 xsl:attribute;属性值动态 → 可直接 AVT。不复杂但容易忽略语法边界。











