XSLT:省略输出

时间:2016-10-24 12:25:33

标签: xml bash xslt

我有以下xml文件:

<table border="1">
  <tr valign="top">
    <td align="left">value1</td>
    <td align="left">not wanted 1</td>
  </tr>
  <tr valign="top">
    <td align="left">value2</td>
    <td align="left">not wanted 2</td>
  </tr>
</table>

我想在一个单独的行上打印所有value x。以下XSL几乎可以实现我的目的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes">
  </xsl:output>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/table/tr">
    <xsl:value-of select="./td[1]" />
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

输出结果为:

$ xsltproc filter.xsl file.xml
value1
value2

$ 

如您所见,它在最后一个值之后打印一个尾随换行符。我不想要这个换行符。我可以通过将结果传递给sed来轻松删除它,但这似乎是一个相当笨拙的解决方案。

XSL可以省略最后一个换行符吗?

3 个答案:

答案 0 :(得分:1)

我。如果有任何后续兄弟tr,请向前看:

<xsl:template match="/table/tr">
    <xsl:value-of select="./td[1]" />
    <xsl:if test="following-sibling::tr">
        <xsl:text>&#xa;</xsl:text>
    </xsl:if>
</xsl:template>

II。 其他合适的解决方案是通过模板和position()

<xsl:template match="/table/tr">
    <xsl:value-of select="./td[1]" />
    <xsl:text>&#xa;</xsl:text>
</xsl:template>

<xsl:template match="/table/tr[last()]" priority="1.1">
    <xsl:value-of select="./td[1]" />
</xsl:template>

last()获取上下文节点的最后位置。

需要

priority来避免任何含糊不清的规则警告。

编辑/建议1:自我关闭您的xsl:output

答案 1 :(得分:1)

为上一个tr添加例外:

<xsl:template match="/table/tr[position()=last()]">
  <xsl:value-of select="./td[1]" />
</xsl:template>

答案 2 :(得分:0)

使用XSLT 2.0处理器:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes" method="text"/>

  <xsl:template match="/">
    <xsl:value-of select="/table/tr/td[1]" separator="&#xa;"/>
  </xsl:template>

</xsl:stylesheet>

或XQuery 1.0处理器:

string-join(/table/tr/td[1], '&#xa;')