避免混合内容元素中的换行符

时间:2015-03-17 16:19:55

标签: xslt xslt-2.0

我需要根据(不)在某些结果元素之前设置换行符来控制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 ;.)

1 个答案:

答案 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> 元素之间没有空格。