Возможна ли потоковая передача с поддержкой схемы? - PullRequest
0 голосов
/ 23 января 2020

Предположим, у меня есть простая схема, которая использует xs: sequence (не xs: all).

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="mynamespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="mynamespace" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="RepeatingElement" type="repeatingElementType" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="repeatingElementType">
        <xs:sequence>
            <xs:element name="FirstElement" type="xs:string"/>
            <xs:element name="SecondElement" type="xs:string"/>
            <xs:element name="ThirdElement" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

Затем я пишу преобразование с поддержкой схемы, которое использует узлы в последовательном порядке.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0" xmlns:n1="mynamespace" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml"/>
    <xsl:mode streamable="yes"/>
    <xsl:import-schema namespace="mynamespace" schema-location="sampleSchema.xsd"></xsl:import-schema>
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="element(*, n1:repeatingElementType)">      
        <xsl:value-of select="n1:FirstElement" />
        <xsl:value-of select="n1:SecondElement" />
        <xsl:value-of select="n1:ThirdElement" />
    </xsl:template>
</xsl:stylesheet>

Прямо сейчас потоковые механизмы (например, SAXON) сгенерируют ошибку.

Template rule is declared streamable but it does not satisfy the streamability rules. * There is more than one consuming operand: {xsl:value-of} on line 10, and {xsl:value-of} on line 11

Учитывая, что движок знает порядок появления элементов, разве он не сможет определить на этапе анализа, что таблица стилей пригодна для потоков?

1 Ответ

2 голосов
/ 23 января 2020

Анализ стреймабельности, встроенный в XSLT 3.0 spe c и реализованный в Saxon, не учитывает какие-либо знания порядка братьев и сестер, которые могут быть получены из знаний схемы. Это можно сделать теоретически, но правила станут очень сложными для обработки любых, кроме самых простых случаев. (Рассмотрим, например, xsl:choose в таблице стилей, который структурно соответствует xs:choice в схеме ...) РГ приняла раннее решение исключить это из области.

...