XSLT模式感知验证是否与“替代”一起使用

问题描述

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

我正在使用Saxon C#API saxon9ee-api库针对其架构“编译”(出于验证目的)架构感知型xslt(我使用的是Oxygen,但实际上这增加了一层配置,使事情变得更复杂)。 目的是使XSD的“样式”(将自动生成)和XSLT的“样式”(将由人类编写)形式化,以在XSD更改时在XSLT中捕获尽可能多的错误

一个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>

这将表现得很好...这可以验证,如果我将“旋转”引用更改为“ rotation1”,那么我会得到

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中的类型错误

问题是

  • “替代”基本上短路类型检查吗? (即使只有1个替代方案,我也理解替代方案的语义吗?)
  • 如果可以的话,有办法解决(即建议使用“ element()”,我会尝试。
  • 此外,还有一些选项可以针对无法/尚未进行类型检查的代码段引发警告,我想通过将其检测为警告来排除误报情况。

一个问题是,是否有关于模式识别XSLT的好的教程/书籍等,除了试图理解规范之外,可怜的东西很少。

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...