比较XSLT中的xs:boolean值?

比较XSLT中的xs:boolean值?,xslt,boolean,Xslt,Boolean,我有一个xml模式,其元素定义为xs:boolean类型,如下所示: <xs:element name="useful" minOccurs="1" maxOccurs="1" type="xs:boolean"/> <xsl:choose> <xsl:when test="@useful = 0">No</xsl:when> <xsl:otherwise>Yes&l

我有一个xml模式,其元素定义为xs:boolean类型,如下所示:

<xs:element name="useful"
              minOccurs="1" maxOccurs="1"
              type="xs:boolean"/>
<xsl:choose>
   <xsl:when test="@useful = 0">No</xsl:when>
   <xsl:otherwise>Yes</xsl:otherwise>
</xsl:choose>

我试图在XSL中使用choose/when/Others块,根据该块的值输出特定的内容,如下所示:

<xs:element name="useful"
              minOccurs="1" maxOccurs="1"
              type="xs:boolean"/>
<xsl:choose>
   <xsl:when test="@useful = 0">No</xsl:when>
   <xsl:otherwise>Yes</xsl:otherwise>
</xsl:choose>

不
对
我尝试了我能想到的每一种比较方法(使用true(),false(),1,0,删除@,使用//),它总是输出“是”。我做错了什么

编辑(根据Martin Honnen的请求):

下面是正在使用的XML示例:

<?xml version="1.0"?>
<functions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:noNamespaceSchemaLocation="functions.xsd">
   <function>
      <name>func1</name>
      <useful>0</useful>
   </function>

   <function>
      <name>func2</name>
      <useful>1</useful>
   </function>
</functions>

职能1
0
功能2
1.
我认为这会导致使用xsl:template时出现问题,因此我使用xsl:for-each循环遍历每个函数,并尝试为每个有用的标记输出特定的内容。xsl:template只能在xslt的顶层使用,对吗

完整的XSLT文件是

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
      <html><body>
         <h2>Functions</h2>
            <table border="1">
              <tr>
                  <th>Functions</th>
                  <th>Useful</th>
               </tr>
               <xsl:for-each select="functions/function">
                  <tr>
                     <td>
                        <xsl:value-of select="name"/>
                     </td>
                     <td>
                        <xsl:choose>
                           <xsl:when test="@useful = 0">No</xsl:when>
                           <xsl:otherwise>Yes</xsl:otherwise>
                        </xsl:choose>
                     </td>
                  </tr>
               </xsl:for-each>
            </table>
         </body></html>
      </xsl:template>
</xsl:stylesheet>

功能
功能
有用的
不
对

您的模式定义了一个名为“有用”的元素,但除非您尝试使用支持模式的XSLT 2.0,否则该模式根本不相关

在XPath中执行
@use
,将选择上下文节点名称的一个属性,该属性与您拥有的模式没有任何意义,因为它定义了一个元素。 因此,向我们展示XSLT正在处理的XML实例,然后我们可以向您展示一些XSLT代码:

<xsl:template match="useful">
  <xsl:choose>
    <xsl:when test=". = 'false' or . = 0">No</xsl:when>
    <xsl:otherwise>Yes</xsl:otherwise>
  </xsl:choose>
</xsl:template>

不
对
使用支持模式的XSLT2.0,您可以

<xsl:template match="useful">
  <xsl:value-of select="if (data(.)) then 'Yes' else 'No'"/>
</xsl:template>

我认为模式定义了一个元素,但您正在测试一个属性的值——这可能是您的主要问题。

<xsl:choose> 
   <xsl:when test="@useful = 0">No</xsl:when> 
   <xsl:otherwise>Yes</xsl:otherwise> 
</xsl:choose> 
将此转换应用于以下XML文档时

<t>
    <useful>true</useful>
    <useful>false</useful>
    <useful>1</useful>
    <useful>0</useful>
</t>
<t>
    <useful>
  Yes
 </useful>
    <useful>
  No
 </useful>
    <useful>
  Yes
 </useful>
    <useful>
  No
 </useful>
</t>

其中当前节点是
有用的
元素的父节点。

好问题,+1。请参阅我的答案以获得完整的解决方案。