XSLT在每行末尾附加Ctrl + M字符

时间:2015-09-01 20:12:07

标签: xml xslt

我正在尝试使用xslt转换xml doc。虽然我得到了所需的结果,但我在文档的末尾看到了ctrl + M char。如何确保在行尾之前没有填充^ M.

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

这不是dos to unix问题。我在linux平台上运行xslt文件。

下面的示例输出
<variables>^M$
    <variable name="enableLog" value="false" />^M$
    <variable name="enableCache" value="true" />^M$
    <variable name="protocol" value="http" />^M$
    <variable name="port" value="8080" />^M$
 </varilabes>^M$ 

1 个答案:

答案 0 :(得分:0)

我认为您所谓的Ctrl + M字符实际上是carriage return,有些编辑将其显示为^M。如果您在支持非XML的编辑器中查看生成的XML,该编辑器显示Ctrl-J / Ctrl-M(换行符,回车符)字符,那么这就是您在每行末尾看到这些字符的原因。 / p>

使用Ctrl-M作为XML中的行结束字符是完全有效的。事实上,它甚至被推荐。创建XML的产品(包括XSLT处理器)在线路终端时允许在换行和回车之间进行选择。更具体地说,来自XML 1.0 spec (since 1997)

  

2.11生产线末端处理
  XML解析的实体通常存储在计算机文件中,为方便编辑,这些文件被组织成行。这些行通常由字符CARRIAGE RETURN(#xD)和LINE FEED(#xA)的某种组合分隔。

由于XML适用于机器阅读并且具有人类可读性,因此请选择能够理解XML的编辑器,例如oXygenStylus Studio,甚至XML Notepad,或简单的{{3}就足够了,他们都能理解行尾。

注意:如果您确实要删除任何和所有行结尾,请将以下内容添加到样式表中:

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

确保应用所有文本节点,以便您可以执行以下操作以删除被认为重要的空文本节点:

<xsl:template match="text()[not(normalize-space())]" />

但是,这仍然会留下任何已有换行符的文本节点。如果您还需要删除它们,请执行以下操作:

<xsl:template match="text()">
    <xsl:value-of select="translate(., '&#xA;&#xD', '  ')"/>
</xsl:template>