XML / XSL用<br/>替换空格

时间:2014-01-06 21:45:06

标签: xml xslt

我正在尝试清理代码的可读性。使用v1。我非常感谢你对我做错的任何帮助。

我拥有的XML代码:

    ...
    <trusted-servers>mark mike sally</trusted-servers>
    ...

我希望它显示以下方式:

    mark
    mike
    sally

最初,它以这种方式显示使用(<xsl:value-of select="trusted-servers"/>):

    mark mike sally

我试过的是:

    <xsl:value-of select="string-length(substring-before(trusted-servers, concat(' ', trusted-servers, '<xsl:text disable-output-escaping="yes"><![CDATA[<br />]]></xsl:text>')))" data-type="string"/>

但它会抛出一个错误,表示不允许使用未转义的字符<。我尝试取出<xsl:text disable-output-escaping="yes"><![CDATA[<br />]]></xsl:text>部分并将其替换为<br/>但仍有相同的错误。我在其他任何方面都毫无头绪。

2 个答案:

答案 0 :(得分:3)

假设xsltproc你有http://exslt.org/str/functions/tokenize/index.html所以你可以做

<xsl:template match="trusted-servers">
  <xsl:for-each select="str:tokenize(., ' ')">
    <xsl:if test="position() > 1"><br/></xsl:if>
    <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:template>

您在xmlns:str="http://exslt.org/strings"上声明xsl:stylesheet

答案 1 :(得分:3)

一般来说,应尽可能避免使用<xsl:text disable-output-escaping="yes">

由于您使用的是XSLT 1.0,因此最好的解决方案是编写一个模板,该模板将递归替换<br>遇到的第一个空格,例如:

<xsl:template match="trusted-servers" name="replace-space-by-br">
    <xsl:param name="text" select="."/>
    <xsl:choose>
        <xsl:when test="contains($text, ' ')">
            <xsl:variable name="head" select="substring-before($text, ' ')"/>
            <xsl:variable name="tail" select="substring-after($text, ' ')"/>
            <xsl:value-of select="$head"/>
            <br/>
            <xsl:call-template name="replace-space-by-br">
                <xsl:with-param name="text" select="$tail"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>