我必须重复以下XSLT片段100次,我希望它尽可能小。有没有办法制作更短的等效XSLT片段?
<xslo:variable name="myVariable" select="//This/that/anotherthing" />
<xslo:choose>
<xslo:when test="string($myVariable) != 'NaN'">
<xslo:text>1</xslo:text>
</xslo:when>
<xslo:otherwise>
<xslo:text>0</xslo:text>
</xslo:otherwise>
</xslo:choose>
我基本上根据源xml中的/ This / that / anotherthing中是否存在值来设置复选框的状态。
可以是XSLT 1.0或XSLT 2.0,并不重要。
答案 0 :(得分:2)
您可以使用if
代替xsl:choose
(仅限XSLT 2.0)...
<xsl:value-of select="if (string(number(//This/that/anotherthing)) = 'NaN') then 0 else 1"/>
我也放弃了xsl:variable
,但是如果你出于其他原因需要它,你可以把它放回去。
您还可以创建function ...
<xsl:function name="local:isNumber">
<xsl:param name="context"/>
<xsl:value-of select="if (string(number($context)) = 'NaN') then 0 else 1"/>
</xsl:function>
...使用
<xsl:value-of select="local:isNumber(//This/that/anotherthing)"/>
答案 1 :(得分:1)
<xslo:variable name="myVariable" select="//This/that/anotherthing" />
<xslo:value-of select="number(boolean($myVariable))"/>
答案 2 :(得分:0)
如果我理解正确的目的 - 如果有问题的值可以成功地表示为数字,那么返回1,否则为0 - 那么我相信:
<xsl:value-of select="number(//This/that/anotherthing castable as xs:double)"/>
将是实现它的最直接的方式(在XSLT 2.0中)。
鉴于您的目的更改:
我基本上是根据是否设置复选框的状态 // This / that / anotherthing
中存在一个值
这更简单:
<xsl:value-of select="number(boolean(string(//This/that/anotherthing)))"/>