Эта функция является функцией XPath 3.0 / 3.1 https://www.w3.org/TR/xpath-functions-30/#func-parse-xml-fragment, поэтому вы найдете ее в процессорах XSLT, поддерживающих XPath 3. В зависимости от версии и версии Saxon ее можно использовать, если вы используете version="3.0"
в вашей таблице стилей, даже если у вас есть версия и / или версия Saxon, которая не поддерживает окончательную спецификацию XSLT 3.0 (например, Saxon 9.8 является первым основным выпуском Saxon, который реализует окончательную спецификацию XSLT 3, но функции XPath 3, такие как * 1004) * также поддерживаются в Saxon 9.7, если вы используете version="3.0"
в своем коде XSLT, если я правильно помню).
Вы не сказали нам, какой процессор, версию и версию вы используете, возможно, вы сможете использовать или реализовать ее как функцию расширения.
Существует также анализатор HTML Дэвида Карлайла https://github.com/davidcarlisle/web-xslt/blob/master/htmlparse/htmlparse.xsl в чистом XSLT 2, который можно использовать (или, по крайней мере, злоупотреблять) в качестве синтаксического анализатора XML (фрагмента), если вы, например, используете false()
для третьего аргумента таблица стилей
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:dpc="data:,dpc"
exclude-result-prefixes="#all">
<xsl:import href="https://raw.githubusercontent.com/davidcarlisle/web-xslt/master/htmlparse/htmlparse.xsl"/>
<xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<html>
<head>
<title>New Version!</title>
</head>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section[h2 = 'Test']/ul/li">
<xsl:copy>
<xsl:value-of select="count(dpc:htmlparse(., '', false())/node())"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
at http://xsltransform.hikmatu.com/948Fn5t/2 находит правильное количество дочерних узлов во фрагментах, используемых в качестве входных данных (например,
<li><![CDATA[<foo>foo 1</foo><bar>bar 1</bar><foo>foo 2</foo>]]></li>
<li><![CDATA[text<element/>text<element>...</element>text]]></li>
считает 3 и 5 узлов), то же самое, что parse-xml-fragment
делает в https://xsltfiddle.liberty -development.net / eiZQaFH с Saxon 9.8.
Однако вы обнаружите, что функция htmlparse
может анализировать неправильно сформированную разметку, тогда как функция parse-xml-fragment
выдаст ошибку для всего, что не следует правилам XML для внешней проанализированной сущности.