问题描述
(这是一个完全重写的问题)
我正在使用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的属性。”