【问题标题】:Does XSLT schema aware validation work with "alternative"XSLT 模式感知验证是否与“替代”一起使用
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 这是否意味着执行“替代”的“测试”子句以评估类型,然后模板化以匹配元素函数中的类型?
  • 成功了,我会尽快将其标记为答案,知道我们是否可以强制撒克逊人将未经检查的代码报告为警告?
猜你喜欢
  • 2021-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多