我有一段看起来像这样的XML:
<bunch of other things>
<bunch of other things>
<errorLog> error1 \n error2 \n error3 </errorLog>
我想修改此XML运行的XSLT,以便在errors1
到error3
之后应用换行符。
我可以完全控制errorLog的输出或XSLT文件的内容,但我不知道如何制作XML或XSLT以使输出HTML显示换行符。是否更容易将XML输出更改为将导致换行的某个特殊字符,还是修改XSLT以将\n
解释为换行符?
有一个example on this site包含类似于我想要的内容,但我的<errorLog>
XSLT嵌套在另一个模板中,我不确定模板中的模板是如何工作的。
答案 0 :(得分:3)
反斜杠用作许多语言(包括C和Java)中的转义字符,但不用于XML或XSLT。如果你把\ n放在你的样式表中,那不是换行符,那就是两个字符反斜杠后跟“n”。编写换行符的XML方式是

。但是,如果您以HTML格式向浏览器发送换行符,则会将其显示为空格。如果您想要浏览器显示换行符,则需要发送<br/>
元素。
答案 1 :(得分:2)
如果您可以控制errorLog
元素,那么您也可以使用文字LF字符。就XSLT而言,它与任何其他角色没有什么不同。
对于创建使用换行符显示的HTML,您需要添加<br/>
元素来代替XML源中的标记。如果您可以将每个错误放在一个单独的元素中,这将是最简单的,比如
<errorLog>
<error>error1</error>
<error>error2</error>
<error>error3</error>
</errorLog>
然后,XSLT不必经历分裂文本本身的相当笨拙的过程。
从您的问题中获取此XML数据
<document>
<bunch-of-other-things/>
<bunch-of-other-things/>
<errorLog>error1 \n error2 \n error3</errorLog>
</document>
此样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:template match="/document">
<html>
<head>
<title>Error Log</title>
</head>
<body>
<xsl:apply-templates select="*"/>
</body>
</html>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="errorLog">
<p>
<xsl:call-template name="split-on-newline">
<xsl:with-param name="string" select="."/>
</xsl:call-template>
</p>
</xsl:template>
<xsl:template name="split-on-newline">
<xsl:param name="string"/>
<xsl:choose>
<xsl:when test="contains($string, '\n')">
<xsl:value-of select="substring-before($string, '\n')"/>
<br/>
<xsl:call-template name="split-on-newline">
<xsl:with-param name="string" select="substring-after($string, '\n')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$string"/>
<br/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
将产生此输出
<html>
<head>
<title>Error Log</title>
</head>
<body>
<bunch-of-other-things/>
<bunch-of-other-things/>
<p>error1 <br/> error2 <br/> error3<br/>
</p>
</body>
</html>