XSL 如何测试布尔数据类型?

XSL how do i test a boolean data type?

我正在尝试测试架构中定义为布尔数据类型的属性。 XML 是动态创建的,如果 XML 中的值为 1,我只想打印一些东西。但是没有任何打印。

这是架构

<xs:element name="Data">
                    <xs:complexType>
                      <xs:all minOccurs="1" maxOccurs="1"> 
                        <xs:element id="variable" name="variable" type="xs:boolean" />
                      </xs:all>
                    </xs:complexType>
                  </xs:element>

这是XML

<Data>
                    <variable>1</variable>
                    <variable2>0</variable2>
                    <variable3>1</variable3>
                  </Data>

我试过各种方法。这是我尝试过的方法(我尝试过 WHEN 和 IF)

<xsl:choose>        
                    <xsl:when test="variable = '1'">Print something</xsl:when>
                    <xsl:when test="variable = 1">Print something</xsl:when>
                    <xsl:when test="variable = 'true'">Print something</xsl:when>
                    <xsl:when test="@variable = 1">Print something</xsl:when>
                    <xsl:when test="@variable = '1'">Print something</xsl:when>
                    <xsl:when test="@variable = true">Print something</xsl:when> 
                    <xsl:otherwise>
                      <!--nothing-->
                    </xsl:otherwise>
                </xsl:choose>

                  <xsl:if test="variable = '1'">Print something</xsl:if>
                  <xsl:if test="variable = 'true'">Print something</xsl:if>

我的 XSL 以此开头

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"

第一件事:除非您使用模式感知处理器,否则您的模式说什么并不重要。

接下来,如果您使用的是 XSLT 2.0 处理器,正如您的样式表声明的那样,那么您可以通过应用以下测试来判断一个值是真还是假:

test="xs:boolean(value)"

例如,给定以下测试输入:

XML

<Data>
    <variable>1</variable>
    <variable>0</variable>
    <variable>true</variable>
    <variable>false</variable>
</Data>

并应用以下样式表:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/Data">
    <result>
        <xsl:for-each select="variable">
            <xsl:copy>
                <xsl:choose>        
                    <xsl:when test="xs:boolean(.)">Print something</xsl:when>
                    <xsl:otherwise>
                        <!--nothing-->
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:copy>
        </xsl:for-each>
    </result>
</xsl:template>

</xsl:stylesheet> 

将产生以下结果

<?xml version="1.0" encoding="UTF-8"?>
<result>
   <variable>Print something</variable>
   <variable/>
   <variable>Print something</variable>
   <variable/>
</result>

对应于 XML Schema 定义的布尔数据类型的允许值。


您真的在使用 XSLT 2.0 处理器吗?

我有充分的理由怀疑:您的样式表还声明了 Microsoft 名称空间:

xmlns:msxsl="urn:schemas-microsoft-com:xslt"

据我所知,没有 Microsoft XSLT 2.0 处理器。

要在 XSLT 1.0 中执行相同的测试,您需要执行以下操作:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/Data">
    <result>
        <xsl:for-each select="variable">
            <xsl:copy>
                <xsl:choose>        
                    <xsl:when test="number(.) or .='true'">Print something</xsl:when>
                    <xsl:otherwise>
                        <!--nothing-->
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:copy>
        </xsl:for-each>
    </result>
</xsl:template>

</xsl:stylesheet>

如果您可以确定 variable 的值 总是 只有 1 或 0,那么您可以将测试缩短为:

<xsl:when test="number(.)">