xml - 使用输入 xsd 架构验证 XSL 文档选择和匹配属性

标签 xml xslt xsd xsd-validation

XSLT“选择”和“匹配”(可能还有更多)属性是否可能针对输入数据 XSD 架构进行验证?

例如,如果我的 XSD 架构定义了名为“realRoot”的输入 XML 根元素

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="realRoot" type="rootType"/>

  <xs:complexType name="rootType">
    <xs:sequence>
      ...
    </xs:sequence>
  </xs:complexType>
</xs:schema>

然后是 XSL

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xsl:my="http://example.org/my-schema"
  xsi:schemaLocation="http://example.org/my-schema my-schema.xsd">

  <xsl:template match="/my:fakeRoot">
    ...
  </xsl:template>

</xsl:stylesheet>

很快就会失败,因为架构中没有定义fakeRoot元素。

它可以帮助更快地发现错误,可以更轻松地重构 XML 模式,并在 IDE 中为这些 XSLT 属性实现自动完成。

最佳答案

是的,原则上是可行的。在实践中,我不知道有任何 XSLT 处理器可以执行此类分析,当我听到有关此类事情的研究论文时,我总是带走的信息是“哇,这很快就变得复杂了!”

一些复杂的因素:

  • XSD 没有提供明确的方法来将特定的顶级元素识别为潜在的文档根元素,因此您想象的故事的前提已经有点不确定。

  • XSLT 旨在与任何格式良好的 XML(或者,严格来说,XSLT 处理器可以读取的 XPath 数据模型的任何实例)一起使用,因此样式表可以假定输入的有效性仅在特殊操作模式,未在规范中定义。

  • XSLT 中模板驱动的控制流使得生成可能的输入节点的严密描述变得非常困难,这些节点在评估特定模板时将成为当前节点;结果是可能状态的空间非常大,这使得很难为处理器可以利用的模式生成良好的保证。

综上所述,处理器肯定有可能查看匹配模式并选择样式表中的表达式,并针对每个样式表说明它原则上是否可以匹配输入文档中对给定模式有效的任何节点.这会更容易处理,仍然有用,并且可能成为一个很好的学生项目。

关于xml - 使用输入 xsd 架构验证 XSL 文档选择和匹配属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544837/

相关文章:

xml - <xsd :all> and <xsd:sequence> in schema definition? 之间的区别

java - 使用 Java 从与属性名称匹配的 XML 文件中删除所有 xml 属性?

xml - 如何用替换br标签 XSL模板中的标签?

java - 我们有撒克逊特定的 Transformer 类吗?

xml - 使用 xslt/c# 比较两个 xml 文件

python - 如何使用 lxml 验证 XSD 架构,但忽略与给定模式匹配的元素?

默认命名空间中的 XML 属性名称和元素?

java - 使用 SAX 解析器拆分 XML

Java 8 字符串内存不足错误

.net - 基于元素值的 XSD 条件