转换程序是否可以忽略XML标记错误?

转换程序是否可以忽略XML标记错误?,xml,xslt,Xml,Xslt,我想使用XSLT转换如下所示的XML文件: <?xml version="1.0" encoding="UTF-8"?> <row> <stuff>Her we have some text and some false markup like <this> and so on</stuff> </row> 她说我们有一些文本和一些虚假的标记,比如等等 如果我开始转换,我将得到一个错误,即“this”

我想使用XSLT转换如下所示的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<row>
     <stuff>Her we have some text and some false markup like <this> and so on</stuff>    
</row>

她说我们有一些文本和一些虚假的标记,比如等等

如果我开始转换,我将得到一个错误,即“this”没有结束标记。有没有可能绕过这个问题?

当您提到氧气时,我认为您可以在Saxon 9中使用XSLT 2或3。在这种情况下,您可以尝试使用纯XSLT2编写的David Carlisle的标记汤解析器是否能够提供所需的解析结果

我用你们两个例子中的最后一个做了一个例子

    <root>
        <paragraph>Is 3 < 4?</paragraph>
        <paragraph>XSLT is powerful <:</paragraph>
    </root>

3小于4吗?
XSLT的强大功能是3<4?
XSLT功能强大
它将其解析为

    <root>
        <paragraph>Is 3 &lt; 4?</paragraph>
        <paragraph>XSLT is powerful &lt;:</paragraph>
    </root>

是34吗?
XSLT功能强大:
因此,对于解析器可能根据需要修复标记的这两个示例,在实际应用程序中,您当然可以加载任何非XML文件,就像使用
未解析文本
一样,然后将返回的字符串馈送到
d:htmlpasse
函数,而不是像我在示例中所做的那样,将XSLT中包含的数据用作CDATA部分

另一个选项是向您提供Saxon 9商业版的oXygen用户使用扩展功能


但最好的建议是修复输入的生成,以使用XML工具,使输入从一开始就是XML。

这取决于环境,通常XSLT处理器依赖于底层XML解析器,这样的XML解析器只会在XSLT处理器开始工作之前报告格式错误的XML。另一方面,在某些平台上有一些API(SAX、XmlReader),它们可能允许您插入自己的解析器,然后纠正错误并向XSLT处理器提供正确的事件方式,以便能够转换输入。但是您没有在任何地方指出您使用的是哪个平台,也没有指出您对未关闭的
这个
元素的预期。@MartinHonnen我使用的是氧气和Saxon6.5.5作为转换器。问题是,有时只有“嗯,正如我所说的,您需要插入一个解析器,该解析器根据您希望它用于将输入呈现给XSLT处理器的规则来解析错误的输入,在Java的情况下,您可以编写自己的SAX解析器,然后能够创建SAX事件(例如,
2<4
的字符)您希望它能够表示出来。但是规则必须明确才能清楚地实现这一点,编写这样的解析器也不是一件容易的任务。您还可以检查各种HTML标记分析器是否能为您提供有用的结果,即使输入不是HTML。@MartinHonnen因此,也许我应该在生成XML文件之前更早地解决这个问题d、 假设我改变了一切”我的建议是避免在开始时生成格式错误的标记,而是确保从一开始就生成格式良好的XML。有很多API和工具,包括XSLT、XQuery、各种DOM/XOM/JDOM,可以帮助您实现这一点。使用pur无法修复某些部分是XML,而其他部分是不可能的正如我所说的,各种JSoup/HTML TagSoup解析器可能是解析标记的起点,其规则不如XML严格,但是集成它们甚至调整它们并不适合StackOverflow的注释。
    <root>
        <paragraph>Is 3 &lt; 4?</paragraph>
        <paragraph>XSLT is powerful &lt;:</paragraph>
    </root>