我正在尝试使用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$
答案 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的编辑器,例如oXygen或Stylus 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(., '

', ' ')"/>
</xsl:template>