Как вы упомянули oXygen, я думаю, что вы можете использовать XSLT 2 или 3 с Saxon 9. В этом случае вы можете попробовать, дает ли парсер суппорта тега Дэвида Карлайла https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl, написанный на чистом XSLT 2, вамрезультат разбора вам нужен.
Я сделал пример с последним из ваших двух примеров
<root>
<paragraph>Is 3 < 4?</paragraph>
<paragraph>XSLT is powerful <:</paragraph>
</root>
в https://xsltfiddle.liberty -development.net / eiZQaFc , полная таблица стилей
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
xmlns:d="data:,dpc"
exclude-result-prefixes="xs math d"
version="3.0">
<xsl:import href="https://github.com/davidcarlisle/web-xslt/raw/master/htmlparse/htmlparse.xsl"/>
<xsl:param name="mal-formed-markup" as="xs:string"><![CDATA[
<root>
<paragraph>Is 3 < 4?</paragraph>
<paragraph>XSLT is powerful <:</paragraph>
</root>
]]></xsl:param>
<xsl:template match="/">
<xsl:copy-of select="d:htmlparse($mal-formed-markup, '', false())"/>
</xsl:template>
</xsl:stylesheet>
и он разбирает это на
<root>
<paragraph>Is 3 < 4?</paragraph>
<paragraph>XSLT is powerful <:</paragraph>
</root>
, поэтому для этих двух примеров парсер может исправить вашу разметку по вашему желанию, и в вашем реальном приложении вы, конечно, можете загрузить любой файл не XMLиметь с unparsed-text
, а затем передать эту возвращенную строку в функцию d:htmlparse
вместо использования данных, включенных в XSLT, в качестве раздела CDATA, как я сделал для примера.
Другой вариант - oXygenПользователь, который предлагает вам коммерческие выпуски Saxon 9, должен использовать функцию расширения http://saxonica.com/html/documentation/functions/saxon/parse-html.html.
Но лучший совет - исправить генерацию ввода с использованием инструментов XML, чтобы вводом был XML изначало.