比较XSLT中的xs:boolean值?
我有一个xml模式,其元素定义为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
<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。请参阅我的答案以获得完整的解决方案。