XSLT 架构感知验证是否适用于 "alternative"

Does XSLT schema aware validation work with "alternative"

(这是一个完全重写的问题)

我正在使用 Saxon C# API saxon9ee-api 库来“编译”(出于验证目的)模式感知 xslts 针对他们的模式(我使用的是氧气,但实际上添加一层使事情变得更复杂的配置)。 objective 是为了形式化 XSD 的“样式”(将自动生成)和 XSLT 的“样式”(将由人工编写),以便在 XSLT 中捕获尽可能多的错误XSD 变化。

来个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="TRIANGLETYPE">
    <xs:sequence>
    </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="TRIANGLE" type="TRIANGLETYPE">
    <!--<xs:alternative type="TRIANGLETYPE"/>-->
  </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="schema-element(TRIANGLE)">
    <foo>
      <xsl:value-of select="@rotation"/>
    </foo>
  </xsl:template>
</xsl:stylesheet>

这会表现得很好......这个验证,如果我将“旋转”引用更改为“旋转 1”然后我得到

The complex type Q{}TRIANGLETYPE does not allow an attribute named rotation1

这就是我想要的。 但是,如果我将 XSD 更改为

  <xs:element name="TRIANGLE">
    <xs:alternative type="TRIANGLETYPE"/>
  </xs:element>

而不是显式类型

  <xs:element name="TRIANGLE" type="TRIANGLETYPE">

然后对 XSLT 的推断“失败”- 在某种意义上,当它引用未定义的属性“rotation1”时,它不会检测到 XSLT 中的类型错误。

所以问题是

一个额外的问题,在架构感知 XSLT 方面是否有任何好的 tutorials/books 等,除了试图理解规范之外,那里的东西少得可怜。

我只用 Saxon 10 EE 测试过,但确实 xsl:template match="element(TRIANGLE, TRIANGLETYPE)" 似乎是一种触发警告的方法,例如“SXWN9000 复杂类型 Q{}TRIANGLETYPE 不允许名为 rotation1 的属性”。