XSLT中when分支内容不显示问题求助(附XML及代码片段)
嘿,我来帮你捋捋这个问题!你说用<xsl:when>展示节点值时内容一直不显示,结合你给的XML和半拉代码片段,我先列几个最可能踩的坑,再给你完整的可运行示例参考。
常见问题排查
- XPath路径或命名空间没搞定:你代码里用了
dc:前缀,说明XML里的dc元素大概率是带命名空间的(你给的XML里没写,但实际场景里几乎都会有),如果XSLT里没绑定对应的命名空间,XPath根本找不到节点,自然啥都不显示。另外for-each的select属性如果路径写错了,遍历不到目标节点,后续的when也白搭。 - 节点值的空格坑:看你XML里的
<nameIdentifierScheme>值是URI(前后有空格),如果when里的条件写的是='URI',那肯定匹配不上,得用normalize-space()把空格清掉再比较。 - 漏了
<xsl:choose>包裹:<xsl:when>不能单独用,必须放在<xsl:choose>标签里面,不然语法无效,浏览器或处理器直接忽略这段逻辑。
完整示例代码
先补全带命名空间的输入XML(毕竟你代码里用了dc:前缀):
<dc xmlns="http://purl.org/dc/elements/1.1/"> <creator> <nameIdentifier> Caro </nameIdentifier> <nameIdentifierScheme> URI </nameIdentifierScheme> <nameScheme> Test </nameScheme> <creatorName> Roger </creatorName> </creator> </dc>
对应的XSLT代码,比如我们要根据nameIdentifierScheme的值来展示不同的内容:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dc="http://purl.org/dc/elements/1.1/"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <root> <dc:identifier> <!-- 遍历creator节点 --> <xsl:for-each select="dc:dc/dc:creator"> <xsl:choose> <!-- 用normalize-space处理空格,确保条件匹配 --> <xsl:when test="normalize-space(dc:nameIdentifierScheme) = 'URI'"> <xsl:value-of select="normalize-space(dc:nameIdentifier)"/> </xsl:when> <xsl:when test="normalize-space(dc:nameScheme) = 'Test'"> <xsl:value-of select="normalize-space(dc:creatorName)"/> </xsl:when> <!-- 没有匹配条件时的兜底 --> <xsl:otherwise> <xsl:text>No matching content found</xsl:text> </xsl:otherwise> </xsl:choose> </xsl:for-each> </dc:identifier> </root> </xsl:template> </xsl:stylesheet>
关键点说明
- 命名空间绑定:XSLT里必须声明和XML一致的
dc命名空间,这样dc:dc、dc:creator这些XPath才能正确找到节点。 - 空格处理:
normalize-space()会去掉字符串前后的空格,还会把中间的多个空格换成单个,避免因为XML里的缩进空格导致条件不匹配。 - 结构正确性:所有
<xsl:when>和<xsl:otherwise>都要放在<xsl:choose>里面,这是XSLT的语法要求。
如果按这个来还是不行,你可以把完整的for-each代码贴出来,我再帮你细查!
内容的提问来源于stack exchange,提问作者Pavel C. P.
相关产品推荐
相关产品推荐

