我想在XSLT中为文本输出生成换行符。有什么想法吗?
答案 0 :(得分:223)
以下XSL代码将生成newline(换行符)字符:
<xsl:text>
</xsl:text>
对于carriage return,请使用:
<xsl:text>
</xsl:text>
答案 1 :(得分:48)
我喜欢这样做的方法如下:
<xsl:stylesheet>
<xsl:output method='text'/>
<xsl:variable name='newline'><xsl:text>
</xsl:text></xsl:variable>
<!-- note that the layout there is deliberate -->
...
</xsl:stylesheet>
然后,每当您想要输出换行符(可能在csv中)时,您可以输出如下内容:
<xsl:value-of select="concat(elem1,elem2,elem3,$newline)" />
我从xml输入输出sql时使用过这种技术。实际上,我倾向于为逗号,引号和换行创建变量。
答案 2 :(得分:45)
在xsl:output标记上包含属性Method =“text”,并在适当的位置在XSL的文字内容中包含换行符。如果您希望保持XSL的源代码整洁,请使用您想要换行的实体
。
答案 3 :(得分:26)
您可以使用:<xsl:text> </xsl:text>
参见示例
<xsl:variable name="module-info">
<xsl:value-of select="@name" /> = <xsl:value-of select="@rev" />
<xsl:text> </xsl:text>
</xsl:variable>
如果你在文件中写这个。
<redirect:write file="temp.prop" append="true">
<xsl:value-of select="$module-info" />
</redirect:write>
此变量将生成一个新行infile:
commons-dbcp_commons-dbcp = 1.2.2
junit_junit = 4.4
org.easymock_easymock = 2.4
答案 4 :(得分:5)
恕我直言,不再需要@Florjon给出的信息。也许还有一些小细节可以理解为什么它有时候对我们不起作用。
首先,

中的

(十六进制)或<xsl:text/>
(十进制)将始终有效,但您可能看不到它。
<br/>
会很好。否则你会看到一个空白区域。从浏览器中查看源代码将告诉您实际发生了什么。但是,有些情况下您会预期此行为,尤其是如果使用者不是直接浏览器。例如,您希望创建一个HTML页面,并在将其提供给浏览器之前,使用空行和标识很好地查看其结构。disable-output-escaping
的位置以及不需要的位置。以下示例我必须从另一个创建xml并从样式表中声明其DTD。 第一个版本确实转义了字符(xsl:text的默认值)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" encoding="utf-8"/>
<xsl:template match="/">
<xsl:text><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
<xsl:copy>
<xsl:apply-templates select="*" mode="copy"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="copy"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
以下是结果:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
好吧,它完成了我们的期望,完成了转义,以便我们使用的字符正确显示。根节点内的XML部分格式由ident="yes"
处理。 但仔细观察,我们发现换行符

未按原样进行转义和翻译,执行双线换行!我对此没有解释,很高兴知道。任何人?
第二个版本没有逃避角色,因此他们正在制作他们的意图。所做的改变是:
<xsl:text disable-output-escaping="yes"><!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">


</xsl:text>
以下是结果:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Subscriptions SYSTEM "Subscriptions.dtd">
<Subscriptions>
<User id="1"/>
</Subscriptions>
那没关系。 cr和lf都被正确渲染。
nl
,而不是crlf
(nl=lf
)。我的第一次尝试是仅使用cr:
,而输出xml由DOM正确验证。 我正在查看损坏的xml:
<?xml version="1.0" encoding="utf-8"?>
<Subscriptions>riptions SYSTEM "Subscriptions.dtd">
<User id="1"/>
</Subscriptions>
DOM解析器忽略了控制字符,但渲染没有。在我意识到我没有看到这个有多傻之前,我花了很长时间才碰到头!
为了记录,我确实在体内使用了一个变量,两个CRLF都是100%确定它可以在任何地方使用。
答案 5 :(得分:3)
我添加了您在此处看到的DOCTYPE
指令:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [
<!ENTITY nl "
">
]>
<xsl:stylesheet xmlns:x="http://www.w3.org/2005/02/query-test-XQTSCatalog"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
这允许我使用&nl;
代替

在输出中生成换行符。与其他解决方案一样,这通常放在<xsl:text>
标记内。
答案 6 :(得分:2)
我发现<xsl:text>
中的文字换行符与使用

的文字换行符之间存在差异。
虽然文字换行在我的环境中运行良好(使用Saxon和默认的Java XSLT处理器),但是当它在.NET环境中运行的另一个组执行时,我的代码失败了。
更改为实体(

)使我的文件生成代码在Java和.NET上一致运行。
此外,文字换行很容易被IDE重新格式化,并且当文件由“不知道”的人维护时,可能会无意中丢失。
答案 7 :(得分:2)
根据我的经验,我注意到生成一个新行 INSIDE 一个<xsl:variable>
子句不起作用。
我试图做一些像:
<xsl:variable name="myVar">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
<xsl:text></xsl:text> <!--NEW LINE-->
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar"/>
</div>
我试图放入“新行”(空<xsl:text>
节点)的任何东西都不起作用(包括本页中的大多数更简单的建议),更不用说HTML刚赢了在那里工作,所以最终我不得不将它拆分为2个变量,在<xsl:variable>
范围之外调用它们并在它们之间加上一个简单的<br/>
,即:
<xsl:variable name="myVar1">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My value: </xsl:text>
<xsl:value-of select="@myValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<xsl:variable name="myVar2">
<xsl:choose>
<xsl:when test="@myValue != ''">
<xsl:text>My other value: </xsl:text>
<xsl:value-of select="@myOtherValue" />
</xsl:when>
</xsl:choose>
<xsl:variable>
<div>
<xsl:value-of select="$myVar1"/>
<br/>
<xsl:value-of select="$myVar2"/>
</div>
是的,我知道,这不是最复杂的解决方案,但它有效,只是与XSL分享我的挫折经验;)
答案 8 :(得分:2)
您可以尝试
For the month of: January
EXP FEE
TRANSID EXPID PAYMENT TRANSID FEEID PAYMENT
trans01 exp01 1,000.00 trans03 fee01 3,000.00
trans02 exp02 2,000.00 trans04 fee02 4,000.00
trans05 fee03 5,000.00
它将起作用。
答案 9 :(得分:1)
我是第二个Nic Gibson的方法,这是 永远是我的最爱:
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
但是我一直在使用Ant任务&lt; echoxml&gt;至 创建样式表并针对文件运行它们。该 任务将执行属性值模板,例如$ {DSTAMP}, 但也会重新格式化你的xml,所以在某些 例如,实体参考是可取的。
<xsl:variable name='nl'><xsl:text>
</xsl:text></xsl:variable>
答案 10 :(得分:1)
我不能只使用<xsl:text>
</xsl:text>
方法,因为如果我使用XSLT格式化XML文件,实体将会消失。所以我不得不使用变量
<xsl:variable name="nl" select="' '"/>
<xsl:template match="/">
<xsl:value-of select="$nl" disable-output-escaping="no"/>
<xsl:apply-templates select="*"/>
</xsl:template>
答案 11 :(得分:0)
<xsl:text xml:space="preserve">
</xsl:text>
答案 12 :(得分:-4)
只需添加此标记:
<br/>
它对我有用;)。