如何在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
相关产品推荐
相关产品推荐

