Предупреждение о покрытии кода с использованием schema aware XSLT

#xslt-2.0 #saxon #xslt-3.0

#xslt-2.0 #saxon #xslt-3.0

Вопрос:

Мне интересно, есть ли какие-либо предупреждения о покрытии кода — в основном предупреждение о том, что строки или разделы кода не могут быть проверены на тип, или какие-либо базовые методы для обеспечения того, чтобы такие разделы не существовали.

Для иллюстрации у меня есть XSD.

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">

  <xs:complexType name="SQUARETYPE">
    <xs:sequence>
      <xs:element name="contains">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="SQUARE"/>
            <xs:element ref="TRIANGLE"/>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="kind"/>
    <xs:attribute name="width" type="xs:int"/>
    <xs:attribute name="x" type="xs:int"/>
    <xs:attribute name="y" type="xs:int"/>
  </xs:complexType>
  <xs:complexType name="FILLEDSQUARETYPE">
    <xs:sequence>
      <xs:element name="contains">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="SQUARE"/>
            <xs:element ref="TRIANGLE"/>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="kind"/>

    <xs:attribute name="colour" type="xs:string"/>
    <xs:attribute name="width" type="xs:int"/>
    <xs:attribute name="x" type="xs:int"/>
    <xs:attribute name="y" type="xs:int"/>
  </xs:complexType>
  <xs:complexType name="TRIANGLETYPE">
    <xs:sequence>
      <xs:element name="contains">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element ref="SQUARE"/>
            <xs:element ref="TRIANGLE"/>
          </xs:choice>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="rotation" type="xs:int"/>
    <xs:attribute name="x" type="xs:int"/>
    <xs:attribute name="y" type="xs:int"/>
  </xs:complexType>
  <xs:element name="SQUARE">
    <xs:alternative test="@kind = 'FILLEDSQUARETYPE'" type="FILLEDSQUARETYPE"/>
    <xs:alternative test="@kind = 'SQUARETYPE'" type="SQUARETYPE"/>
    <xs:alternative type="xs:error"/>
  </xs:element>
  <xs:element name="TRIANGLE">
    <xs:alternative type="TRIANGLETYPE"/>
  </xs:element>
  <xs:element name="rootShape">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="SQUARE"/>
        <xs:element ref="TRIANGLE"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>
  

и xslt

 <?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:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="xs msxsl"
    version="2.0">

  <xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>

  <xsl:import-schema schema-location="MessingAbout.xsd"/>
  <xsl:template match="/">
    <xsl:apply-templates select="schema-element(SQUARE)"/>
  </xsl:template>
  <xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
    <foo>
      <xsl:value-of select="@colour"/>
    </foo>
  </xsl:template>
</xsl:stylesheet>
  

Я думаю, что это имеет 100% покрытие (хотя начальное совпадение с «/» не проверяется).

Если бы я изменил xslt, чтобы сказать это.

 <?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:msxsl="urn:schemas-microsoft-com:xslt"
    exclude-result-prefixes="xs msxsl"
    version="2.0">

  <xsl:output method="xml" indent="yes" encoding="UTF-8" version="1.0"/>

  <xsl:import-schema schema-location="MessingAbout.xsd"/>
  <xsl:template match="/">
    <xsl:apply-templates select="SQUARE"/>
  </xsl:template>
  <xsl:template match="element(SQUARE,FILLEDSQUARETYPE)">
    <foo>
      <xsl:value-of select="@colour"/>
    </foo>
  </xsl:template>
</xsl:stylesheet>
  

затем там строка

     <xsl:apply-templates select="SQUARE"/>
  

не проверено, я могу заменить «SQUARE» на «SQUARE1», и это не будет проверяться (понятно).

Можно ли включить какой-либо параметр, который предупреждает меня об этом? Итак, я могу обеспечить, чтобы мои XSLT всегда проверялись на тип? (даже если это исключает определенные «допустимые», но не проверяемые программы (это обычный компромисс)).

Ответ №1:

Все это проверяется на тип, но тщательность статической проверки типов зависит от того, сколько информации о типе доступно. Так что это не черно-белые 0% или 100%. По сути, во время компиляции процессор выполняет всю возможную проверку типов и откладывает остальное до времени выполнения. Есть некоторые проверки, которые Saxon не пытается выполнить, даже если это теоретически возможно, например, все, что связано с осями, отличными от дочерних, атрибутов и потомков.

Комментарии:

1. ok…hmmmm…is существует ли стиль программирования, при котором всегда будет проверяться тип? просто для каждого, никаких причудливых осей?

2. PS Я подозреваю, что это вопрос мнения, но имеет ли XQuery тенденцию иметь меньше пробелов во время компиляции?

3. Да, XQuery более статически разрешим, чем XSLT, потому что у него нет механизма динамической отправки правил шаблонов. В XQuery 1.0 также была опция «строгой статической типизации», в которой все, что может произойти сбой во время выполнения, становится статической ошибкой; но это оказалось не очень полезным (я думаю, что сегодня это в основном встречается в реализации SQL Server от Microsoft). И это было достигнуто частично за счет ограничения осей, которые вы можете использовать для навигации, что ужасно.

4. итак, saxon не использует опцию строгой статической типизации?

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