对XSLT 2.0的HTML输入:如何处理?

时间:2015-05-30 19:45:14

标签: html xml xslt

有很多关于保留和使用XSLT的问题,如何在XSLT中输出空格字符,以及&在CDATA输入中。这是一个不同的问题:我有包含& nbsp的HTML文件,我想将它们转换为XML。我无法弄清楚如何使用Saxon XSLT 2.0处理器读取输入。这适用于文本挖掘应用程序,因此我无法控制输入。

以下是输入中的示例文本:

<P STYLE="line-height:0px;margin-top:0px;margin-bottom:0px;border-> bottom:0.5pt solid #000000">
&nbsp;
</P> 

首先,我只想消除输出中的所有&amp; nbsp。一旦我能做到这一点,我将消除STYLE和其他HTML结构之类的属性。

问题在于我根本无法让Saxon输入HTML文件。我收到了这个错误。

SXXP0003: Error reported by XML parser: The entity "nbsp" was referenced, but not declared.

这是我的测试XSL文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#160;"> ]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns="http://www.w3.org/1999/html"
        version="2.0">
  <xsl:output method="xml" omit-xml-declaration="yes" encoding="utf-8"/>
  <xsl:strip-space elements="*"/>
  <!-- copy all elements and their attributes-->
  <xsl:template match="* | @*">
    <xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
  </xsl:template>
</xsl:stylesheet>

我现在正在学习XSLT,所以有一些我不太了解的结构。我认为DOCTYPE声明允许在XSL文件中使用&amp; nbsp,而不是在输入文件中。我尝试将DOCTYPE声明更改为

<!DOCTYPE xsl:stylesheet [ <!ENTITY html "&#160;"> ]>

那没有效果。我也删除了

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

来自xsl:stylesheet声明,它没有解决问题。

显然,我不是唯一遇到此问题的人。我确定有一个简单的解决方法,我一直无法找到它。这让我无法做真正的工作,所以我发现自己非常沮丧。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用saxon:parse-html()扩展函数来读取HTML并将其作为标准XDM树呈现。

或者,如果您想使用Saxon-HE而不是-PE或-EE,请创建一个SAXSource来读取您的输入,其中XMLReader是一个HTML解析器,如TagSoup或validator.nu。

答案 1 :(得分:0)

如果你想解析HTML而不是XML,那么你必须确保你有一个HTML解析器,你告诉Saxon使用它而不是XML解析器。因此,请下载TagSoup(http://home.ccil.org/~cowan/tagsoup/)或HTML5解析器(https://about.validator.nu/htmlparser/)。