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