我需要根据(不)在某些结果元素之前设置换行符来控制XSL转换过程的输出。拿这个输入
<text>
<line>My text uses <hi>highlighting</hi> methods</line>
<line>Next line uses <hi>two </hi><hi>highlighter</hi> elements...</line>
</text>
由这个简单的样式表转换:
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="line">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="hi">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:transform>
转变的不良后果是:
<p>My text uses <span>highlighting</span> methods</p>
<p>Next line uses <span>two </span>
<span>highlighter</span> elements...</p>
<span>
中的第二个<p>
会产生换行符,这不是我想要的。
这种行为的原因是什么以及如何避免它,这意味着:如何实现这一结果:
<p>My text uses <span>highlighting</span> methods</p>
<p>Next line uses <span>two </span><span>highlighter</span> elements...</p>
(是的,我需要<xsl:output indent="yes">
,转换方法必须是&#34; xml&#34 ;.)
答案 0 :(得分:4)
我可以通过您在问题的最后一行(method="xml"
和indent="yes"
)中指定的约束来解决此问题的唯一方法是将xml:space="preserve"
添加到{{ 1}}您创建的元素,如
空白字符绝不能插入结果文档的一部分,该部分由
p
属性控制,值为xml:space
。
(Source)
preserve
请注意,由于<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml"/>
<xsl:template match="line">
<p xml:space="preserve"><xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="hi">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:transform>
,您还必须删除xml:space="preserve"
元素和子p
的开始和结束标记之间的空格。当使用Saxon 9 HE在您的示例输入上运行时,会生成输出
xsl:apply-templates
如果您可以改为使用<?xml version="1.0" encoding="UTF-8"?>
<p xml:space="preserve">My text uses <span>highlighting</span> methods</p>
<p xml:space="preserve">Next line uses <span>two </span><span>highlighter</span> elements...</p>
输出方法(和XHTML命名空间),则不允许XHTML压头在标签周围添加空格,这些标签用于开始或结束XHTML指定为&#34;内联&#的元素34;标记,包括xhtml
。
span
在同一输入上运行时会产生
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output indent="yes" method="xhtml"/>
<xsl:template match="/">
<html><body><xsl:apply-templates/></body></html>
</xsl:template>
<xsl:template match="line">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match="hi">
<span>
<xsl:apply-templates/>
</span>
</xsl:template>
</xsl:transform>
两个<?xml version="1.0" encoding="UTF-8"?><html xmlns="http://www.w3.org/1999/xhtml">
<body>
<p>My text uses <span>highlighting</span> methods
</p>
<p>Next line uses <span>two </span><span>highlighter</span> elements...
</p>
</body>
</html>
元素之间没有空格。