Есть ли альтернатива для функции fn: parse-xml-фрагмент, использующей XSLT 2.0? - PullRequest
0 голосов
/ 05 сентября 2018

Я новичок в этом мире XSLT, и у нас возникла ситуация, когда мы хотели использовать функцию fn:parse-xml-fragment(), которая поддерживается версией XSLT 3.0.

Однако в нашем фреймворке мы все еще находимся на XSLT версии 2.0 и не можем обновить saxon.jar до версии 9.6.
Есть ли альтернативный способ, которым мы могли бы достичь того же результата, что и эта функция, однако в XSLT версии 2.0?

1 Ответ

0 голосов
/ 05 сентября 2018

Эта функция является функцией 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 для внешней проанализированной сущности.

...