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 中的类型错误。
所以问题是
- “alternative”是否基本上绕过了类型检查? (即使只有 1 个备选方案——我是否理解备选方案的语义?)
- 如果是这样,是否有解决此问题的方法(即建议使用“element()”,我会尝试。
- 此外,是否有一些选项可以针对 cannot/has 未进行类型检查的代码部分发出警告,我想通过将其检测为警告来排除误报情况。
一个额外的问题,在架构感知 XSLT 方面是否有任何好的 tutorials/books 等,除了试图理解规范之外,那里的东西少得可怜。
我只用 Saxon 10 EE 测试过,但确实 xsl:template match="element(TRIANGLE, TRIANGLETYPE)"
似乎是一种触发警告的方法,例如“SXWN9000 复杂类型 Q{}TRIANGLETYPE 不允许名为 rotation1 的属性”。
(这是一个完全重写的问题)
我正在使用 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 中的类型错误。
所以问题是
- “alternative”是否基本上绕过了类型检查? (即使只有 1 个备选方案——我是否理解备选方案的语义?)
- 如果是这样,是否有解决此问题的方法(即建议使用“element()”,我会尝试。
- 此外,是否有一些选项可以针对 cannot/has 未进行类型检查的代码部分发出警告,我想通过将其检测为警告来排除误报情况。
一个额外的问题,在架构感知 XSLT 方面是否有任何好的 tutorials/books 等,除了试图理解规范之外,那里的东西少得可怜。
我只用 Saxon 10 EE 测试过,但确实 xsl:template match="element(TRIANGLE, TRIANGLETYPE)"
似乎是一种触发警告的方法,例如“SXWN9000 复杂类型 Q{}TRIANGLETYPE 不允许名为 rotation1 的属性”。