You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

关键点说明

  1. 命名空间绑定:XSLT里必须声明和XML一致的dc命名空间,这样dc:dc、dc:creator这些XPath才能正确找到节点。
  2. 空格处理:normalize-space()会去掉字符串前后的空格,还会把中间的多个空格换成单个,避免因为XML里的缩进空格导致条件不匹配。
  3. 结构正确性:所有<xsl:when>和<xsl:otherwise>都要放在<xsl:choose>里面,这是XSLT的语法要求。

如果按这个来还是不行,你可以把完整的for-each代码贴出来,我再帮你细查!

内容的提问来源于stack exchange,提问作者Pavel C. P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:29:41