2016-10-24 50 views
0

我有下面的XML文件:XSLT:省略最後的換行符在輸出

<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省略嗎?

回答

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

添加一個異常最後tr

<xsl:template match="/table/tr[position()=last()]"> 
    <xsl:value-of select="./td[1]" /> 
</xsl:template> 
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;')