在XSL中的一次选择中调用translate()两次



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

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

您要替换整个字符串还是部分字符串?不清楚你在做什么。如果整个字符串要么为"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>

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

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

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

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

如果原始值为'False',内部调用将'F'转换为'n', 'a'转换为'o', 'l', 's'和'e'转换为空字符串;然后,外部调用发现没有出现字母"T","r","u"或"e",并且不做任何事情。如果原始值为'True',则内部调用将'e'转换为空字符串,留下值'Tru',外部调用将'T'转换为'y', 'r'转换为'e', 'u'转换为's'。如果您使用的是XSLT 2.0,那么使用replace()可能不那么复杂:

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

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

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

<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>

UPDATE:当我回答你的问题时,我没有注意到它,但是@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()函数用第三个参数中的字符替换作为第一个参数传递的字符串中存在于第二个参数中的单个字符,这些字符位于的相同位置。在您的情况下,它工作是因为@isadmin 中的字符串是一个精确匹配比替换字符串更长。例如,要恢复这一点是不可能的。:

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

将得到'Fa',而不是'False',因为n将被F取代,'o'将被'a'取代,其他字符将被丢弃。

注意:replace()函数只存在于XSLT 2.0或+中。

相关内容

  • 没有找到相关文章

最新更新