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

时间:2015-02-17 18:41:37

标签: xml xslt xsd

我正在尝试测试在架构中定义为布尔数据类型的属性。 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"

1 个答案:

答案 0 :(得分:1)

首先:除非您使用架构感知处理器,否则您的架构所说的并不重要。

接下来,如果您正在使用XSLT 2.0处理器,就像样式表所声明的那样,那么您可以通过应用以下测试来查看值是true还是false:

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"

和AFAIK没有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(.)">