代码之家  ›  专栏  ›  技术社区  ›  Joliet

XSLT2.0 Transom的文本输出中有过多的空白

  •  2
  • Joliet  · 技术社区  · 7 年前

    我正在测试一个项目所需的代码,但是输出中有意外的空白,这会有问题。的位置 <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
    

    我正在使用Saxon H-S9API通过节点Java来转换源代码。到目前为止,我已经尝试过了 xsl:strip-space 以及 normalize-space(current-grouping-key()) 两者都失败了。事先谢谢。

    J

    3 回复  |  直到 7 年前
        1
  •  3
  •   Valdi_Bo    7 年前

    作为第二条评论的后续行动 丹尼尔·哈雷 ( 空白来自… ):

    它需要在XSLT和感知方面的一些经验来发现 你的剧本怎么了,显然 丹尼尔·哈雷 写的 在他第一眼看到你的问题后,正确的解决办法。

    您可能已经习惯了逐步缩进嵌入的XSLT代码, 例如,在您的 for-each-group 循环有3个相等的缩进 线:

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

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

    <xsl:text> 你实际上有:

    • 一条新线,
    • 多个空格(或制表符),
    • 最后 </xsl:text> ,关闭要输出的文本。

    所以,你所做的 预期 待输出 以及您(看上去整洁)的脚本输出 事实上 . 您只想输出新行,而您的代码实际上 输出一些额外的空间,破坏结果。

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

        2
  •  2
  •   Martin Honnen    7 年前

    作为另一种选择,您也可以使用 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

        3
  •  -1
  •   imran    7 年前
    <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
    
    推荐文章