问题 如何在xslt中控制布尔渲染


符合 <boolean>  Xml-RPC的规范 我需要转变我的 xs:boolean 从 true|false 至 1|0

我用xsl:choose解决了这个问题

<xsl:template match="Foo">
    <member>
        <name>Baz</name>
        <value>
            <boolean>
                <xsl:choose>
                    <xsl:when test=".='true'">1</xsl:when>
                    <xsl:otherwise>0</xsl:otherwise>
                </xsl:choose>
            </boolean>
        </value>
    </member>
</xsl:template>

但是想知道在用xslt 1.0转换时是否有一种不那么脆弱的方法来控制布尔值的渲染方式。


12334
2017-08-17 08:18


起源

好问题,+ 1。请参阅我的答案,获得完整,简便的解决方案(XPath one-liner)。 :) - Dimitre Novatchev


答案:


使用

number(boolean(.))

通过标准XPath函数的定义 number() 它产生的确切 {0, 1} 分别应用时 {true(), false()}

谨防! 如果你使用这种结构 字符串,结果会 对于'假'和'真'都是如此,因为,对于字符串参数, 当且仅当其长度为非零时,boolean()为true

所以,如果你想转换 字符串而不是布尔,然后使用这个表达式:

number(not(. = 'false'))

以下是基于XSLT的验证

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="text()">
  <xsl:value-of select="number(not(. = 'false'))"/>
 </xsl:template>
</xsl:stylesheet>

何时将此转换应用于以下XML文档

<t>
 <x>true</x>
 <y>false</y>
</t>

产生了想要的正确结果

<t>
   <x>1</x>
   <y>0</y>
</t>

15
2017-08-17 12:49



优秀的als总是 - 但我的首选版本 number(boolean(.)) 似乎不起作用......它总是回归 1。我将进行字符串比较,这将允许我在我的解决方案中使用更通用的模板。 - Filburt
它似乎 number(boolean('false')) 将返回 1 而 number(boolean(false)) 将返回 0 所以最终幸福的剩下问题是如何检索xs:boolean元素的非文字值;-) - Filburt
@Filburt:如果你真的有一个布尔值,那么使用: number(.)。仍然存在问题的原因是您没有提供完整的XML文档和想要的完整结果。当人们猜测这些时,即使10%的成功率也是巨大的。 - Dimitre Novatchev
我承认,如果我没有给出完全充实的示例(包括源和期望的结果),我可以拥有所有内容但是我明确说明我的源值类型是 xs:boolean ......我注意到我的帖子里有一个拼写错误: xsl:boolean 不是真正的类型。在发布我的问题之前我确实在挖掘并尝试过 number(.) 产量 NaN。无论如何你给了100%,我不想忘记为什么xslt 1.0不允许150%;-) - Filburt
我怀疑是否 number(not(. = false())) 会工作 ... - Filburt