【发布时间】:2020-11-08 19:07:20
【问题描述】:
(这是一个完全重写的问题)
我正在使用 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>
这会表现得很好......这个验证,如果我将“旋转”引用更改为“旋转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 中的类型错误。
所以问题是
- “替代”基本上会短路类型检查吗? (即使只有 1 个备选方案 - 我是否理解备选方案的语义?)
- 如果是这样,有没有办法解决这个问题(即建议使用“element()”,我会尝试。
- 此外,是否有一些选项可以针对无法/尚未进行类型检查的代码部分发出警告,我想通过将其检测为警告来排除误报情况。
还有一个问题,是否有任何关于模式感知 XSLT 的好的教程/书籍等,除了尝试理解规范之外,几乎没有。
【问题讨论】:
-
您可以使用
element(FOO_ELEMENT, FooType)我认为“在基于元素名称和类型的模板中匹配”。我不确定这是否能解决你的问题。 -
当您说您正在“进行验证”时,您实际上是在谈论 XSLT 处理器中的静态类型推断吗?一般来说,确实不能保证所有类型错误都会被静态检测到。如果这不是您的意思,请尝试更清楚地解释您在做什么,以及结果与预期有何不同。 可重现的示例总是有用的。
-
明天我会放一个完整的例子。只要我知道孔在哪里,我想我对无保证的类型检查感到满意。
-
因此,对于您没有尝试处理和验证的任何 XML 输入的问题,您只是询问编译 XSLT 时收到的警告以及使用
@rotation1等属性在模式匹配元素内的 XPath 表达式中? -
是的......这只是关于编译(显然我希望 XSLT 在执行时做一些明智的事情,但这是次要问题,这只是关于生成“描述性”模式,然后使用以利用类型信息)。
标签: xslt xslt-2.0 saxon xsd-1.1