使用XSLT将HTML表转换为CSV

时间:2017-04-12 17:47:15

标签: java xml xslt

我有一个包含以下定义的html表

    <table>
    <tr> 
        <th>Order ID</th> 
        <th>Item ID</th> 
        <th>Participant ID</th> 
        <th>Status</th> 
        <th>Shipping Provider</th> 
        <th>Tracking Number</th> 
        <th>Shipped Date</th> 
        <th>Shipping Method</th>
    </tr> 
    <tr> 
        <td align="center"> Ch_H907</td> 
        <td align="center"> 907</td> 
        <td align="center"> DXM09902</td> 
        <td align="center"> Shipped</td> 
        <td align="center"> USPS</td> 
        <td align="center"> </td> 
        <td align="center"> 04/03/2017</td> 
        <td align="center"> Standard Ground</td> 
    </tr> 
    <tr> 
        <td align="center"> Ch_H871</td> 
        <td align="center"> 871</td> 
        <td align="center"> DXM09902</td> 
        <td align="center"> Shipped</td> 
        <td align="center"> USPS</td> 
        <td align="center"> </td> 
        <td align="center"> 04/03/2017</td> 
        <td align="center"> Standard Ground</td> 
    </tr> 
</table>

和xslt翻译定义如下

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
                xmlns:fo="http://www.w3.org/1999/XSL/Format" >
    <xsl:output method="text" omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="/">
        <xsl:for-each select="//tr">
            <xsl:for-each select="td">
                <xsl:value-of select="concat({.},',')"/>
            </xsl:for-each>
             <xsl:value-of select="concat('&#xA;','')"/>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

我想要的输出应该是每个<tr>在一个单独的行上,但上面的翻译会引发异常line 9: Required attribute 'select' is missing.

1 个答案:

答案 0 :(得分:2)

您不需要concat语句中的花括号。

而不是这样做......

<xsl:value-of select="concat({.},',')"/>

这样做......

<xsl:value-of select="concat(.,',')"/>

大括号适合用作Attribute Value Templates

请注意,您可能希望重新编写代码,以避免在每行末尾添加额外的逗号。

    <xsl:for-each select="//tr">
        <xsl:for-each select="td">
            <xsl:if test="position() > 1">,</xsl:if>
            <xsl:value-of select="."/>
        </xsl:for-each>
         <xsl:text>&#xA;</xsl:text>
    </xsl:for-each>