求助:XSL中无法基于XML布尔值通过if条件渲染按钮
问题分析与修复方案
核心问题
- 错误的取值逻辑:XSLT处理的是原始XML数据源,你不能在生成HTML节点后,立刻用XPath查询自己刚生成的
<span>节点——此时该节点属于输出树,并非源XML的一部分,所以//span[@id='userGroup']/text()根本取不到任何值。 - 数据源值不匹配:你的Content.xml中
<Datum>的内容是tr,但判断条件却和'true'做比较,即便取值逻辑正确,也无法触发预期的条件分支。
修复后的代码
修正后的Appearance.xsl
<?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xsl:template match="/"> <html> <body> <!-- 可选:保留用于显示的span --> <span id="userGroup"><xsl:value-of select="/Data/Datum[@ID='D02']"/></span> <!-- 直接从源XML获取值,跳过无效的中间节点查询 --> <xsl:variable name="userGroupValue" select="/Data/Datum[@ID='D02']/text()" /> <!-- 用xsl:choose替代重复的xsl:if,逻辑更清晰 --> <xsl:choose> <!-- 注意:如果Content.xml中的值确实是'tr',请将此处的'true'改为'tr' --> <xsl:when test="$userGroupValue = 'true'"> <button id="myButton" style="background-color: #4CAF50; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: pointer;">Click Me</button> </xsl:when> <xsl:otherwise> <button id="myButton" style="background-color: #ccc; border: none; color: white; padding: 15px 32px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; cursor: not-allowed;">Click Me</button> </xsl:otherwise> </xsl:choose> </body> </html> </xsl:template> </xsl:stylesheet>
可选:修正Content.xml的数据源
如果tr是拼写错误,建议将Content.xml中的<Datum>值改为标准布尔值:
<?xml version="1.0" encoding="UTF-8"?> <Data> <Datum ID="D02" Type="Boolean" Name="userGroup">true</Datum> </Data>
补充说明
- 始终直接从原始XML数据源提取需要的值,不要试图查询XSLT正在生成的输出节点。
- 使用
<xsl:choose>替代两个互斥的<xsl:if>,可以避免冗余代码,同时确保只会触发一个分支。
内容的提问来源于stack exchange,提问作者akash
相关产品推荐
相关产品推荐

