0

我试图了解schema-element()用作SequenceType文字结果元素时的工作原理。这是我的样式表

<xsl:stylesheet
  version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="xs">

  <xsl:import-schema>
    <xs:schema>
      <xs:element name="foo">
        <xs:complexType>
          <xs:attribute name="bar"/>
        </xs:complexType>
      </xs:element>
    </xs:schema>
  </xsl:import-schema>

  <xsl:variable name="test" as="schema-element(foo)">
    <foo bar="baz"/>
  </xsl:variable>

  <xsl:template match="/">
    <xsl:sequence select="$test"/>
  </xsl:template>

</xsl:stylesheet>

Saxon-EE 9.4.0.4(在 Oxygen 14.1 中)给了我以下编译错误Required item type of value of variable $test is schema-element(foo); supplied value has item type element(foo, {http://www.w3.org/2001/XMLSchema}untyped)

根据XSLT 2.0 和 XPath 2.0 程序员参考

当在 SequenceType 中使用构造 «schema-element(N)» ... 时,N 必须是全局元素的名称 ... 在导入的模式中声明。

同一来源的其他地方

«as="schema-element(EVENT)"» 表示 [a parameter] 必须是元素节点,该元素节点被验证为 EVENT 或 EVENT 替换组中的元素。

似乎应该通过导入的模式<foo bar="baz"/>验证为元素。似乎它会有所帮助,但前提是我在导入的模式中有一个命名的复杂类型。我错过了什么或做错了什么?foo@xsl:type

4

2 回答 2

1

你试过用<foo xsl:validation="strict" bar="baz"/>吗?错误消息表明结果元素是在没有类型注释的情况下创建的,因此可能需要显式请求验证,该as属性可能不够用。但我对模式感知 XSLT 2.0 不太熟悉,因此建议您尝试一下。

于 2013-02-04T13:00:37.810 回答
1

一个复杂的问题是,当 xsl:variable 具有文字内容时,该变量将绑定到文档节点(当然,该值可能会在以后以各种方式强制转换为其他类型)。在 Michael Kay 的书第 4 章中关于验证临时树的讨论中,您会发现将 'foo' 元素包装在带有验证属性的 xsl:document 指令中的有益建议。出于稍后将变得清楚的原因,我重命名了该变量:

<xsl:variable name="test0">
  <xsl:document validation="strict">
    <foo bar="baz"/>      
  </xsl:document>
</xsl:variable>

如果真的想test绑定到一个foo元素,而不是一个控制foo元素的文档节点,那么我们可以test这样定义:

<xsl:variable name="test" 
              as="schema-element(foo)" 
              select="$test0/foo"/>

可能有一种更简洁的方法来解决这个问题,没有两步定义,但这确实可以在没有错误消息的情况下工作。

于 2013-02-04T19:10:31.647 回答