如何缩短此XSLT代码段?

时间:2015-07-09 20:27:05

标签: xslt optimization

我必须重复以下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,并不重要。

3 个答案:

答案 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)))"/>