控制XSLT输出中的空格/换行符

时间:2014-06-02 16:02:33

标签: xslt xslt-2.0

我一直在搜索问题,看看这个特别的问题是否得到了回答,但没有成功。如果我错过了,我很抱歉。

我需要“压扁”单个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(.,'&#xA;','\n')"/>
</xsl:template>

但这似乎删除了所有标签,只输出文本。

帮助?

1 个答案:

答案 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>