xsl上的SequenceType的schema-element():带有文字结果元素的变量

时间:2013-02-04 06:17:52

标签: xml xslt xsd xslt-2.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(在氧气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 and XPath 2.0 Programmer's Reference

  

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

同一来源的其他地方

  

«as =“schema-element(EVENT)”»表示[参数]必须是被验证为的元素节点   要么EVENT,要么是EVENT替换组中的元素。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

如果真的希望test绑定到foo元素,而不是主导foo元素的文档节点,那么我们可以定义test:< / p>

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

在没有两步定义的情况下,可能有一种更简洁的方法来解决这个问题,但这样做没有错误信息。