在xslt中删除前导和尾随换行符

时间:2012-03-07 17:10:29

标签: xslt

我有一个结构如下的xml:

<xxx>
<yyy>
some text   with spaces inside
</yyy>
<zzz>
another text
</zzz>
</xxx>

我想生成将使用white-space:pre样式格式化的html,但我必须从节点yyy和zzz中删除换行符。

我的输出应该是这样的:

<div><div>some text   with spaces inside</div><div>another text</div></div>

我试过

<xsl:output method="html" indent="no"/>
<xsl:strip-space elements="*"/>

但它不起作用。换行符仍在那里。

我不能使用normalize-space,因为单词之间的空格很重要。

2 个答案:

答案 0 :(得分:3)

以下XSL会从元素yyyzzz中删除所有换行符:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" />
<xsl:template match="/xxx">
<div>
    <xsl:apply-templates />
</div>
</xsl:template>
<xsl:template match="yyy | zzz">
<div>
    <xsl:value-of select="translate(.,'&#x0d;&#x0a;', '')" />
</div>  
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

因为您只想从字符串中删除第一个和最后一个字符,所以这个更简单的转换就是这样做

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="yyy/text() | zzz/text()">
   <xsl:value-of select="substring(.,2, string-length() -2)"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<xxx>
<yyy>
some text   with spaces inside
</yyy>
<zzz>
another text
</zzz>
</xxx>

产生了想要的正确结果

<xxx>
<yyy>some text   with spaces inside</yyy>
<zzz>another text</zzz>
</xxx>

请注意:在更复杂的情况下,您可能想要去除所有前导空格和所有尾随空格。

如果您使用 trim() 中的 FXSL 功能/模板,则可以执行此操作:

以下是使用trim()

的演示
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="trim.xsl"/>

  <!-- to be applied on trim.xml -->

  <xsl:output method="text"/>
  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

将此转换应用于以下XML文档

<someText>

   This is    some text   

</someText>

生成了想要的(修剪过的)结果

'This is    some text'