【问题标题】:How can I properly convert xhtml to csv?如何正确地将 xhtml 转换为 csv?
【发布时间】:2026-01-18 11:30:01
【问题描述】:

我在使用 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"

&lt;html &gt; 标记,然后将正确生成csv。

这是命名空间问题吗?我该如何解决?

谢谢!

【问题讨论】:

    标签: xml xslt xhtml


    【解决方案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>
    

    【讨论】:

    • 谢谢!它工作得很好。有趣的是,我尝试在上面的样式表中使用 xhtml: 命名空间前缀,但我没有工作;只是绕过模板打印了整个内容,或者什么都不打印。