mon*_*nny 8 xslt xpath boolean ternary
这个Java程序使用一个三元if来映射布尔值到输出字符串:("*"表示true,空字符串表示false).
public class ternary {
public static void main(String[] args) {
boolean flags[]={true,false,true};
for (boolean f : flags) {
System.out.println(f?"*":"");
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以输出是*,[empty],*.
我有一个输入XML文档,如:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="change.xsl"?>
<root>
<change flag="true"/>
<change flag="false"/>
<change flag="true"/>
</root>
Run Code Online (Sandbox Code Playgroud)
我有以下XSLT模板,它将true映射为'*',false映射为''(它可以工作):
<xsl:template match="change">
<xsl:variable name="flag" select="translate(substring(@flag,1,1),'tf','*')"/>
<xsl:value-of select="$flag"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
是否有更简洁的版本?
a)我可以直接从字符串'true | false'自动获取布尔值true | false的值吗?b)是否有(xpath?)构造将布尔值true | false映射到'*',''?
a)我可以直接从字符串'true | false'自动获取布尔值true | false的值吗?
b)是否有(xpath?)构造将布尔值true | false映射到'*',''?
这实际上是一个XPath问题.
I. XPath 1.0
有多个XPath表达式,其评估产生想要的结果:
substring('*', 2 -(@flag = 'true'))
Run Code Online (Sandbox Code Playgroud)
这也回答b) - 注意字符串 'true'并且'false'不是布尔值!只有两个布尔值true(),并false()和他们不是字符串.
在上面的表达式中,我们使用的事实是,在XPath 1.0中,如果布尔值位于需要数字的上下文中,则它会自动转换为数字.根据定义:
number(true()) 是 1
和
number(false()) 是 0
因此,上述呼吁的第二个参数substring():
2 - (@flag = 'true')
Run Code Online (Sandbox Code Playgroud)
被评估为何1时@flag = 'true'以及2否则.
更一般的XPath 1.0表达式,产生该字符串$s1如果$val是"x",产生该字符串$s2是否$val是"y":
concat(substring($s1, 1 div ($val = "x")),
substring($s2, 1 div ($val = "y"))
)
Run Code Online (Sandbox Code Playgroud)
这会产生字符串$s1when $val = "x",字符串$s2when $val = "y"和空字符串 - 如果这两个条件都不成立.
以上的XPath 1.0表达式可以推广以产生N个不同的字符串结果$s1,$2,...,$sN什么时候$val是值中的一个$v1,$v2,...,$vN 因为该函数concat()可以具有任意数量的参数.
II.XPath 2.0(XSLT 2.0)
'*'[current()/@flag = 'true']
Run Code Online (Sandbox Code Playgroud)
更一般地,给定的2个*N原子值$s1,$s2,... $sN和$v1,$v2,..., $vN,使得所有$vi的值是不同的,评估这个XPath 2.0表达式的结果:
($s1, $s2, ..., $sN)[index-of(($v1, $v2, ..., $vN), $v)]
Run Code Online (Sandbox Code Playgroud)
是$sK什么时候$v eq $vK.
| 归档时间: |
|
| 查看次数: |
3002 次 |
| 最近记录: |