我一直在搜索问题,看看这个特别的问题是否得到了回答,但没有成功。如果我错过了,我很抱歉。
我需要“压扁”单个XML节点,以便将它们作为单行输出。不需要节点之间的空格,文本节点中的换行符将被特殊字符('\ n')替换。
示例XML:
<events>
<event>
<id>123</id>
<type>read</type>
<description>
some text here
</description>
</event>
</events>
我想要的输出是:
<events>
<event><id>123</id><type>read</type><description>\nsome text here\n</description></event>
</events>
我尝试使用<xsl:strip-space>
标记,它会处理标记之间的空格,但不会触及元素旁边的换行符。
我尝试添加以下模板:
<xsl:template match="text()">
<xsl:copy-of select="translate(.,'
','\n')"/>
</xsl:template>
但这似乎删除了所有标签,只输出文本。
帮助?
答案 0 :(得分:4)
您的示例XML输入文档:
<events>
<event>
<id>123</id>
<type>read</type>
<description>
some text here
</description>
</event>
</events>
鉴于此XSLT 2.0转型:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="*|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="replace(., '[ \t\r]*\n[ \t\r]*', '\\n')"/>
</xsl:template>
</xsl:stylesheet>
生成您请求的XML输出文档:
<events><event><id>123</id><type>read</type><description>\nsome text here\n</description></event></events>