XSLT <xsl:value-of> 元素最全详解(2025 年最新实用版)
<xsl:value-of> 是 XSLT 中使用频率最高的指令,作用只有一个:
取值 → 输出为文本
一、基本语法(99% 的场景就这两种写法)
<!-- 写法1:最常见(推荐) -->
<xsl:value-of select="xpath-表达式"/>
<!-- 写法2:XSLT 2.0+,可以加 separator(处理多个节点时超好用) -->
<xsl:value-of select="xpath-表达式" separator=", "/>
二、核心属性速查表
| 属性 | 是否必须 | 说明 | 常见用法示例 |
|---|---|---|---|
select | 必须 | XPath 表达式,决定取哪个节点的值 | select="title"、select="@id"、select="." |
separator | 可选 | 当 select 选中多个节点时,中间用什么分隔 | separator=", "、separator=" "(换行) |
disable-output-escaping | 可选 | 是否允许输出原始 HTML 标签(慎用!) | disable-output-escaping="yes" |
三、10 个最常见的真实用法(直接复制就能用)
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 1. 输出当前节点的文本(最常用) -->
<xsl:value-of select="title"/>
<!-- 2. 输出属性值 -->
<xsl:value-of select="@id"/>
<xsl:value-of select="book/@price"/>
<!-- 3. 输出当前节点本身(. 代表当前上下文) -->
<xsl:value-of select="."/>
<!-- 4. 输出根节点某个值(不管当前在哪) -->
<xsl:value-of select="//site-name"/> <!-- 全局查找 -->
<!-- 5. 拼接多个值(XSLT 1.0 经典做法) -->
<xsl:value-of select="first-name"/>
<xsl:text> </xsl:text>
<xsl:value-of select="last-name"/>
<!-- 6. XSLT 2.0+ 一行拼接(超爽!) -->
<xsl:value-of select="first-name, ' ', last-name"/>
<!-- 7. 多个节点用分隔符合并(神级技巧) -->
<xsl:value-of select="//book/title" separator=" | "/>
<!-- 输出:围城 | 三体 | 平凡的世界 -->
<!-- 8. 换行输出(生成 CSV、列表必备) -->
<xsl:value-of select="title" separator=" "/>
<!-- 9. 输出 HTML 标签不被转义(慎用,仅在可信内容时) -->
<xsl:value-of select="content" disable-output-escaping="yes"/>
<!-- 比如 content 里存的是 <b>加粗</b>,就会真的显示加粗 -->
<!-- 10. 安全做法:先转义再输出(推荐) -->
<xsl:value-of select="content" disable-output-escaping="no"/>
<!-- 或者直接用 <xsl:copy-of> 输出元素 -->
</xsl:stylesheet>
四、常见误区 vs 正确姿势
| 你想干的事 | 错误写法 | 正确写法 | 说明 |
|---|---|---|---|
| 输出一整段 HTML | <xsl:value-of select="div"/> | <xsl:copy-of select="div"/> 或 <xsl:apply-templates select="div"/> | value-of 只取文本,标签会被吃掉 |
想输出 <br/> 换行 | <xsl:value-of select="'<br/>'"/> | <xsl:value-of select="'<br/>'" disable-output-escaping="yes"/> 或直接写 <br/> | 更推荐直接写 HTML 标签 |
| 想把多个作者用逗号连接 | 一个个 value-of + text | <xsl:value-of select="author" separator=", "/> | XSLT 2.0+ 专属降维打击 |
五、与类似指令的终极对比表(背会它你就精通了)
| 指令 | 输出内容 | 会输出标签吗? | 适合场景 |
|---|---|---|---|
<xsl:value-of> | 只输出文本(拼接后) | 不会 | 取 title、price、@id 等纯文本 |
<xsl:copy-of> | 完整复制节点(含标签) | 会 | 输出富文本 HTML、复制整个节点 |
<xsl:apply-templates> | 交给其他模板处理 | 看模板怎么写 | 复杂结构、需要递归处理 |
<xsl:text> | 原样输出固定文本 | – | 插入空格、换行、特殊符号 |
六、一句话总结
<xsl:value-of select="xxx"/>= JavaScript 里的innerText = xxx
你想把某个节点的内容“作为纯文本打印出来”,99% 的情况就用它!
七、30 秒实战挑战
把下面这个 XML 变成:《围城》 - 钱钟书, 《三体》 - 刘慈欣
<library>
<book><title>围城</title><author>钱钟书</author></book>
<book><title>三体</title><author>刘慈欣</author></book>
</library>
答案(一行搞定,XSLT 2.0+):
<xsl:value-of select="library/book" separator=" & 《, 》 - ">
<xsl:value-of select="title"/>
<xsl:text>》 - </xsl:text>
<xsl:value-of select="author"/>
</xsl:value-of>
需要我现在帮你用 <xsl:value-of> 实现任何效果(拼接、格式化金额、生成 CSV 行、JSON 字段等),直接甩 XML 过来,10 秒出成品!