如何正确地将xhtml转换为csv?

时间:2014-12-11 20:33:14

标签: xml xslt xhtml

我无法使用xslt将xhtml文件转换为csv。 xhtml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Flight details</title>
</head>
<body>
    <h1>Flight details</h1>
    <ul>
        <li id="nam">BLA145</li>
        <li id="reg">YK-LOL</li>
        <li id="hex">000100</li>
        <li id="alt">34950</li>
        <li id="spd">457</li>
        <li id="hdg">117</li>
        <li id="sqk">4774</li>
    </ul>
</body>
</html>

样式表如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="xhtml xsl">

    <xsl:output method="text" encoding="UTF-8"/>

    <xsl:template match="/">
        <xsl:apply-templates select="html/body/ul/*"/>
    </xsl:template>
    <xsl:template match="li[@id='nam']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='reg']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='hex']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='alt']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='spd']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='hdg']">
        <xsl:value-of select="."/>,
    </xsl:template>
    <xsl:template match="li[@id='sqk']">
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

这将导致无输出。我发现如果我删除

xmlns="http://www.w3.org/1999/xhtml"

来自<html >标记,然后将正确生成csv。

这是命名空间问题吗?我怎么能解决它?

谢谢!

1 个答案:

答案 0 :(得分:1)

您缺少html元素的名称空间前缀(xhtml:)。由于您的输出包含ul的所有子项,因此您甚至可以使用此样式表而不是为每个子项编写模板:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="xhtml xsl">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/">
    <xsl:for-each select="xhtml:html/xhtml:body/xhtml:ul/*">
        <xsl:value-of select="."/>
        <xsl:if test="position() != last()">,</xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>