在XSL中的一个select中调用translate()两次

时间:2014-06-17 20:46:01

标签: xml debugging xslt xslt-1.0

我想用yes和no替换我的列中的true和false。到目前为止,这段代码不起作用,我不能在一个语句中两次调用translate。请帮忙。

<td align="Left" class="tableNormalRow">
    <xsl:value-of select="translate(@isadmin, 'False', 'no'), translate(@isadmin, 'True', 'yes') "/>
</td>

4 个答案:

答案 0 :(得分:2)

您要更换整个字符串还是部分字符串?目前尚不清楚你在做什么。如果整个字符串是“True”或“False”,那么使用replace似乎有点疯狂。只需测试一下价值。使用XSL 1.0,你可以对整个字符串使用简单的测试,或者如果有更多的话,可以使用contains():

<xsl:choose>
  <xsl:when test="@isadmin = 'True')">
     <xsl:text>yes</xsl:text>
  </xsl:when>
  <xsl:otherwise>
     <xsl:text>no</xsl:text>
  </xsl:otherwise>
</xsl:choose>

答案 1 :(得分:1)

如果您喜欢简短而神秘的编码,您可能会喜欢:

<xsl:value-of select="translate(@isadmin, 'TruFalse', 'yesno')"/>

就个人而言,我更喜欢更冗长,更清晰的东西。

答案 2 :(得分:1)

您可以在一个语句中轻松调用translate()两次;只记得它返回一个字符串,并嵌套调用:

translate(translate(@isadmin, 'False', 'no'), 'True', 'yes')

如果原始值为“False”,则内部调用会翻译“F&#39; F&#39; F&#39;到&#39; n&#39;&#39; a&#39;到&#39;,&#39;&#39;&#39;&#39;&#39;&#39;空字符串;外部呼叫然后发现没有出现字母&#39;,&#39; r&#39;,&#39; u&#39;或&#39; e&#39;什么都不做如果原始值为“真实”,那么内部呼叫将翻译“&#39; e”。空字符串留下值&#39; Tru&#39;,外部调用翻译&#39; T&#39;到了&#39;,&#39; r&#39;到&#39;和&#39; u&#39;到了&#39;。如果您使用的是XSLT 2.0,则使用replace()代码可能不那么复杂:

replace(replace(@isadmin, 'False', 'no'), 'True', 'yes')

这些几乎与michael.hor257k提供的解决方案一样紧凑,而且稍微不那么棘手;其他人提供的详细解决方案也没有错。

答案 3 :(得分:0)

您应该使用replace()功能并在不同的模板中处理不同的情况。假设您将<column>元素与isadmin属性匹配:

<xsl:template match="column[@isadmin='False']">
    <td align="Left" class="tableNormalRow">
        <xsl:value-of select="replace(@isadmin, 'False', 'no')"/>
    </td>
</xsl:template>

<xsl:template match="column[@isadmin='True']">
    <td align="Left" class="tableNormalRow">
        <xsl:value-of select="replace(@isadmin, 'True', 'yes')"/>
    </td>
</xsl:template>

更新:我在回答您的问题时没有注意到,但正如@ michael.hor257k在评论中观察到的那样,您实际上不必使用任何函数所有,如果您使用模板和谓词进行选择,如上所示。你可以简单地使用:

<xsl:template match="column[@isadmin='False']">
    <td align="Left" class="tableNormalRow">
        <xsl:text>no</xsl:text>
    </td>
</xsl:template>

<xsl:template match="column[@isadmin='True']">
    <td align="Left" class="tableNormalRow">
        <xsl:text>yes</xsl:text>
    </td>
</xsl:template>

translate()函数替换在第二个参数中存在的第一个参数传递的字符串中找到的单个字符,第三个参数中的字符位于相同位置< / em>的。在你的情况下它是有效的,因为@isadmin 中的字符串与替换字符串完全匹配更长。例如,恢复它是不可能的。这样:

translate('no', 'no', 'False')

会产生'Fa',而不是'False',因为n会被F取代,'o'会被{'a'取代1}},其他字符将被丢弃。

注意:replace()功能仅存在于 XSLT 2.0或+ 中。