XSL输出方法中包含空格的文本,如何在XSL中处理?

4
我正在创建一些XSL将我的XML转换为文本(最终将变成CSV)。我使用VS2008。当我使用编辑器创建XSL时,转换后的输出会按照我的XSL进行缩进。然而,如果我编辑XSL并删除格式化的空格,它就会正确输出 - 但像这样做是一场噩梦。是否有一些XSL预处理命令或标记可以防止这种情况发生?我想忽略XSL中的任何空格,并仅使用或输出文本。我的XSL如下 - 这会缩进输出。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" indent="no"/>
  <!-- @* is all class attributes -->
  <xsl:template match="/">
    <xsl:text>CSV Output</xsl:text>
    <!-- Start of output -->
    <xsl:for-each select="//rows/row">
      <![CDATA[row id=]]><xsl:value-of select="(@id)"/>
    </xsl:for-each>
    <!-- OK, that is the end of the file -->
    <![CDATA[<EOF>]]>
  </xsl:template>
</xsl:stylesheet>

这个的输出如下:
CSV Output
      row id=0
      row id=1
    <EOF>

然而,以下输出是正确的:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="text" indent="no"/>
  <!-- @* is all class attributes -->
  <xsl:template match="/">
    <xsl:text>CSV Output</xsl:text>
    <!-- Start of output -->
    <xsl:for-each select="//rows/row">
<![CDATA[row id=]]><xsl:value-of select="(@id)"/>
</xsl:for-each>
<!-- OK, that is the end of the file -->
<![CDATA[<EOF>]]>
  </xsl:template>
</xsl:stylesheet>

这将正确输出如下:

CSV Output
row id=0
row id=1
<EOF>

我也想控制新行的位置。在我的XSL中,我没有告诉它包含一个新行。
请帮忙!
谢谢,
Andez

顺便提一下,你不必将简单属性选择器放在括号中。还可以参考我添加到user357812(被接受的)答案中的示例。 - PointedEars
2个回答

7

XSLT处理器仅在XSLT元素之间的模板中删除空白文本节点。

因此,在

<xsl:for-each select="//rows/row"> 
  <![CDATA[row id=]]><xsl:value-of select="(@id)"/> 
</xsl:for-each>

xsl:for-each元素有两个空白文本子节点:一个在xsl:value-of之后,会被删除;另一个在CDATA部分之前,不会被删除。

总之:请使用xsl:text元素。

<xsl:for-each select="//rows/row"> 
  <xsl:text><![CDATA[row id=]]></xsl:text>
  <xsl:value-of select="@id"/> 
</xsl:for-each>

1
关于XLST处理器在XSLT元素之间删除空格文本的部分是我缺失的拼图。谢谢! - Robbie Matthews
针对LibXML2用户(PHP,Python,浏览器等)的提示:如果你不使用<xsl:text>,它将不会去除空格! - Peter Krauss

6

您可以使用 xsl:strip 元素来声明哪些元素不应有空格(或者使用*表示所有元素):

<xsl:strip-space elements="*"/>

对应的是xsl:preserve,它允许您声明哪些元素应保留空格。您可以同时使用两者:

<xsl:strip-space elements="*"/>
<xsl:preserve-space elements="td span"/>
<!-- strip spaces from all elements apart from td and span elements -->

当我使用<xsl:strip-space elements=""/>时,它仍然输出带有制表符的CDATA <EOF>... 有什么想法吗?我已经在我的文件顶部xsl:output method="text"下放置了strip-space元素=""。 - Andez
好的 - 我已经移除了CDATA并用xsl文本替换,现在它很好。 - Andez
LibXML2 用户的提示(PHP、Python、浏览器等):如果您不使用 <xsl:text>,它将不会去除空格! - Peter Krauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接