我有以下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>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
输出结果为:
$ xsltproc filter.xsl file.xml
value1
value2
$
如您所见,它在最后一个值之后打印一个尾随换行符。我不想要这个换行符。我可以通过将结果传递给sed
来轻松删除它,但这似乎是一个相当笨拙的解决方案。
XSL可以省略最后一个换行符吗?
答案 0 :(得分:1)
我。如果有任何后续兄弟tr
,请向前看:
<xsl:template match="/table/tr">
<xsl:value-of select="./td[1]" />
<xsl:if test="following-sibling::tr">
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
II。 其他合适的解决方案是通过模板和position()
:
<xsl:template match="/table/tr">
<xsl:value-of select="./td[1]" />
<xsl:text>
</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="
"/>
</xsl:template>
</xsl:stylesheet>
或XQuery 1.0处理器:
string-join(/table/tr/td[1], '
')