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

如何在XSLT中根据条件转换NPD节点值?

解决XSLT中boolean类型节点0/1转Yes/No的问题

嘿,作为XSLT新手碰到这种值转换问题太正常啦!我来给你几个简单易懂的解决方案,直接套进你现有的代码片段里就能用:

方法1:用<xsl:choose>做分支判断(最直观,适合新手)

这是最容易理解的写法,通过分支判断匹配NPD的"0"和"1"值,输出对应的字符串:

<td colspan="3" style="padding-left:10px; width:1.40in; ">
  <xsl:for-each select="$XML">
    <xsl:for-each select="wnio:DD">
      <xsl:choose>
        <!-- 匹配值为"1"的情况,输出"Yes" -->
        <xsl:when test="wnio:NPD = '1'">Yes</xsl:when>
        <!-- 匹配值为"0"的情况,输出"No" -->
        <xsl:when test="wnio:NPD = '0'">No</xsl:when>
        <!-- 处理节点不存在(因为minOccurs="0")或其他异常值的情况 -->
        <xsl:otherwise>Not Specified</xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:for-each>
</td>

因为你的XML里NPD是字符串形式的"0"/"1",直接匹配字符串最稳妥,不用担心XSLT处理器对boolean类型的自动转换差异。

方法2:用条件表达式简化写法(更紧凑)

如果你觉得choose写起来有点繁琐,也可以用XSLT的条件表达式来实现,代码更简洁:

<td colspan="3" style="padding-left:10px; width:1.40in; ">
  <xsl:for-each select="$XML">
    <xsl:for-each select="wnio:DD">
      <xsl:value-of select="if (wnio:NPD = '1') then 'Yes' else if (wnio:NPD = '0') then 'No' else 'Not Specified'"/>
    </xsl:for-each>
  </xsl:for-each>
</td>

这种写法在XSLT 1.0及以上版本都能正常运行,逻辑和choose完全一致,只是形式更紧凑。

方法3:利用boolean类型特性(适合XSLT 2.0+)

因为你的NPD在XSD里定义为xs:boolean,XSLT 2.0及以上版本可以直接用三元运算符结合boolean()函数来判断:

<td colspan="3" style="padding-left:10px; width:1.40in; ">
  <xsl:for-each select="$XML">
    <xsl:for-each select="wnio:DD">
      <xsl:value-of select="boolean(wnio:NPD) ? 'Yes' : 'No'"/>
    </xsl:for-each>
  </xsl:for-each>
</td>

boolean(wnio:NPD)会自动把"1"转换为true(),"0"转换为false(),三元运算符会根据结果直接输出对应的字符串。不过要注意,Altova StyleVision如果默认用XSLT 1.0的话,这种写法可能不兼容,优先用前两种方法更保险。

另外,别忘了处理NPD节点不存在的情况(因为minOccurs="0"),上面的otherwise分支或者else部分可以根据你的需求设置默认值,比如空字符串或者"未指定"。

内容的提问来源于stack exchange,提问作者Romek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:44:32