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