在XSLT中通过with-param将空格传递给模板

时间:2013-09-22 17:06:28

标签: xml xslt code-generation indentation

我正在尝试将XML文档转换为一些纯文本代码输出,并希望有适当的缩进。我没有找到任何好的信息如何实现这一点我开始尝试了一下。

目前我正在尝试使用-param根据应该使用的缩进将空格传递给模板。

<xsl:apply-templates select="foo">
  <xsl:with-param name="indent">  </xsl:with-param>
</xsl:apply-templates>

只有一个问题......如果param只包含空格,则不会传递空格!拥有像字符一样的东西可以传递前导和尾随空格,但只要我只传递空格就会变为空字符串。

<xsl:apply-templates select="foo">
  <xsl:with-param name="indent">  a </xsl:with-param>
</xsl:apply-templates>

这是预期的行为吗?

我在Linux上使用xsltproc来运行转换。

让我知道我可以提供更多信息。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

我只想使用<xsl:with-param name="indent" select="' '"/>

如果要在xsl:with-param内传递值,则需要使用

<xsl:with-param name="indent">
  <xsl:text>  </xsl:text>
</xsl:with-param>

<xsl:with-param name="indent" xml:space="preserve">  </xsl:with-param>

答案 1 :(得分:1)

不要将字符串作为<xsl:with-param>元素的文本节点,而是将其作为select属性传递。

例如,以下XSLT样式表:

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

  <xsl:template match="/">

    <!-- With whitespace only. -->
    <xsl:apply-templates select="foo">
      <xsl:with-param name="indent" select=" '   ' "/>
    </xsl:apply-templates>

    <!-- Carriage return. -->    
    <xsl:text>&#xd;</xsl:text>

    <!-- With leading and trailing whitespace. -->
    <xsl:apply-templates select="foo">
      <xsl:with-param name="indent" select=" '  b  ' "/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="foo">
    <xsl:param name="indent"/>

    <xsl:text>$</xsl:text>
    <xsl:value-of select="$indent"/>
    <xsl:text>$</xsl:text>    
  </xsl:template>

</xsl:stylesheet>

应用于此输入XML时:

<foo>
  Bar
</foo>

产生以下输出:

$   $
$  b  $