xsl:strip-space与xsl:text结合使用会自动缩进

时间:2016-05-13 12:07:21

标签: xslt

使用XSLT 1.0我想注释掉某些XML元素并替换其他XML元素,同时保持XML格式良好。

例如,以下XML文档

renderMyRouterForPath

应转换为

<doc>
  <e1>foo</e1>
  <e2>bar</e2>
</doc>

我正在使用以下XSL转换和<doc> <!--<e1>foo</e1>--> <e3>foobar</e3> <e4>foobar</e4> </doc> 进行测试:

xsltproc

但我得到的是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

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

  <xsl:template match="e1">
    <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> <!--*-->
    <xsl:copy>
      <xsl:apply-templates />
    </xsl:copy>
    <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> <!--*-->
  </xsl:template>

  <xsl:template match="e2">
    <e3>foobar</e3><e4>foobar</e4>
  </xsl:template>

</xsl:stylesheet>

问题似乎是由我的转换中标有'*'的行引起的;更具体地说,从插入<doc><!--<e1>foo</e1>--><e3>foobar</e3><e4>foobar</e4></doc> <!--开始。当我删除这两个元素时,结果按预期缩进。

有没有办法在注释中包含元素,同时仍然保持输出文档的格式良好?

1 个答案:

答案 0 :(得分:1)

尝试输出带元素序列化的注释,如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:import href="http://lenzconsulting.com/xml-to-string/xml-to-string.xsl"/>

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

    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

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

    <xsl:template match="e1">
        <xsl:comment>
            <xsl:call-template name="xml-to-string"></xsl:call-template>
        </xsl:comment>
    </xsl:template>

    <xsl:template match="e2">
        <e3>foobar</e3><e4>foobar</e4>
    </xsl:template>

</xsl:stylesheet>

为您提供更好的结果。