XSLT 2.0 transfom输出的文本中的空格过多

时间:2018-07-25 22:11:38

标签: xml xslt

我正在测试项目所需的代码,但是输出中有意外的空白,这将是有问题的。 <xsl:text>元素 应该 的放置只会导致换行,但是我可能错了。我最大的担心是由于我缺乏经验, 会生成多余的空格,因此,我们将不胜感激。样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

    <xsl:template match="files">
        <xsl:for-each-group select="file"  group-by="@project">
            <xsl:value-of select="current-grouping-key()"/>
            <xsl:text>
            </xsl:text>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

测试源:

<?xml version="1.0" encoding="utf-8"?>
<files>
  <file name="swablr.eps"     size="4313" project="mars"/>
  <file name="batboy.wks"     size="424"  project="neptune"/>
  <file name="potrzebie.dbf"  size="1102" project="jupiter"/>
  <file name="kwatz.xom"      size="43"   project="jupiter"/>
  <file name="paisley.doc"    size="988"  project="neptune"/>
  <file name="ummagumma.zip"  size="2441" project="mars"/>
  <file name="schtroumpf.txt" size="389"  project="mars"/>
  <file name="mondegreen.doc" size="1993" project="neptune"/>
  <file name="gadabout.pas"   size="685"  project="jupiter"/>
</files>

实际输出:

mars
                    neptune
                    jupiter

所需结果:

mars
neptune
jupiter

我正在通过node-java使用Saxon-HE s9api转换源。到目前为止,我已经尝试了xsl:strip-spacenormalize-space(current-grouping-key())两者都失败了。预先感谢。

J。

3 个答案:

答案 0 :(得分:3)

作为 DanielHaley 发表的第二条评论的后续措施 (空白来自... ):

需要一些XSLT和感知能力方面的经验才能发现 您的脚本出了什么问题,显然是 DanielHaley 写道 乍一看您的问题后,正确的解决方案。

您可能已经习惯于逐步缩进嵌入式XSLT代码, 例如在您的for-each-group循环中,有3个相同的缩进量 行:

  • xsl:value-of
  • xsl:text-开头标签,
  • /xsl:text-结束标记。

在某种程度上,这是件好事。看起来很整洁,但有时也需要 弄清楚,您实际上用这些代码说了什么。

<xsl:text>之后,您实际上已经:

  • 换行符
  • 许多空格(或制表符)
  • 最后是</xsl:text>,关闭要输出的文本。

因此,您打算输出的内容有所不同 以及您的(看上去很漂亮的)脚本输出的实际上。 您只想输出换行符,而您的代码实际上 输出一些多余的空格,破坏结果。

现在,至少,您已经获得了一些有关如何编写XSLT代码的经验。 以及如何避免此类错误。

答案 1 :(得分:2)

作为一种替代方法,通常也忽略了您也可以根据需要使用xsl:value-of separator="..."直接分隔包装序列的项目,以便将代码重写为

<xsl:template match="files">
    <xsl:value-of separator="&#10;">
      <xsl:for-each-group select="file"  group-by="@project">
        <xsl:sequence select="current-grouping-key()"/>
      </xsl:for-each-group>
    </xsl:value-of>
</xsl:template>

https://xsltfiddle.liberty-development.net/bFDb2Cp

答案 2 :(得分:-1)

<xsl:template match="files">
            <xsl:for-each-group select="file"  group-by="@project">
                <xsl:value-of select="current-grouping-key()"/>
                <xsl:text>&#x0a;</xsl:text>
            </xsl:for-each-group>
        </xsl:template>
check it