我正在尝试了解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
似乎会有所帮助,但前提是我在导入的模式中有一个命名的复杂类型。我错过了什么或做错了什么?
答案 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"/>
在没有两步定义的情况下,可能有一种更简洁的方法来解决这个问题,但这样做没有错误信息。