我有一个XML文档和关联模式,它将多个属性定义为具有xs:boolean
类型。 xs:boolean
的词汇值为true
,false
,1
和0
,因此似乎要正确选择具有特定布尔值的属性I' d必须写出类似的东西:
@attribute='true' or @attribute='1'
或
@attribute='false' or @attribute='0'
这看起来很冗长。
你可能希望boolean(@attribute)
之类的东西可以工作,但boolean
函数有不同的语义。
有更好的方法吗?这是架构感知处理器可以帮助的东西吗?
答案 0 :(得分:6)
除了Phil和Tomalak提出的解决方案之外,我发现XPath 2.0提供了一些替代方案:
@attribute=('true','1')
string(@attribute) cast as xs:boolean
最后,XPath 2.0确实提供了模式感知处理,这意味着如果一切都在一致,你应该能够写:
data(@attribute)
但架构感知处理器似乎很难找到。最受欢迎的似乎是saxon的非免费商业版本,费用为300英镑。所以现在我正在使用@attribute=('true','1')
。
答案 1 :(得分:3)
尝试以下XPath表达式:
[@attribute=true()]
答案 2 :(得分:1)
您的选择可能取决于您使用的XPath处理器。例如,Microsoft的东西允许您定义可用于实现“布尔(@attribute)”模式的JavaScript函数。我不知道其他引擎是否有类似的支持。
否则我怀疑你不得不检查'true'和'1'。
希望其他人有更好的答案。
答案 3 :(得分:1)
单独使用XPath,您建议的表达式尽可能接近。有不同的方法进行相同的检查,但所有这些都会导致更长,更复杂的表达并更多地隐藏意图。
我认为没有架构感知处理器,XML架构没有连接到XSLT,并且将它支持到处理器,恕我直言中没有多大意义。定义了语言,扩展是添加功能的公认标准方法。
如果您使用的库支持EXSL扩展函数,您可以编写一个半可移植机制来将布尔检查抽象为函数,或者您可以使用特定于供应商的扩展(如MSXSL)。
我认为最好保持你的表达方式。它没有错综复杂,只是有点冗长。
答案 4 :(得分:1)
我使用一个简单的命名模板进行详细检查并根据需要进行调整以处理遗留系统(例如,某些字段可能使用“Y”/“N”,某些字段为“True”/“False”,其他字段为1/0 )并将值转储到变量中。这不是最优雅的方法,但是如果您使用XPath 1.0,没有EXSLT支持,并且不能(或者不想)利用外部脚本调用,它可以一致地工作,并且可以根据需要进行调整。
<xsl:template name="CleanupBool">
<xsl:param name="val" />
<xsl:choose>
<xsl:when test="$val='1'">1</xsl:when>
<xsl:when test="$val='true'">1</xsl:when>
<xsl:when test="$val='True'">1</xsl:when>
<xsl:when test="$val='TRUE'">1</xsl:when>
<xsl:when test="$val='T'">1</xsl:when>
<xsl:when test="$val='Y'">1</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:template>
用法:
<xsl:variable name="enabled">
<xsl:call-template name="CleanupBool">
<xsl:with-param name="val" select="IS_ENABLED"/>
</xsl:call-template>
</xsl:variable>
答案 5 :(得分:0)
@attribute cast as xs:boolean
是一个很好的方法。