很简单,是否可以键入XSLT模板或函数来返回命名序列构造函数?
e.g。在FpML中,有Product.model组,它只包含两个元素(ProductType和ProductId)。我希望能够创建一个返回该序列的类型模板,但不知道“as”属性应该包含什么。
更新
为方便起见,我将包含FpML架构的相关位:
<xsd:group name="Product.model">
<xsd:sequence>
<xsd:element name="productType" type="ProductType" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation xml:lang="en">A classification of the type of product. FpML defines a simple product categorization using a coding scheme.</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="productId" type="ProductId" minOccurs="0" maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation xml:lang="en">A product reference identifier allocated by a party. FpML does not define the domain values associated with this element. Note that the domain values for this element are not strictly an enumerated list.</xsd:documentation>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
所以,我希望能够输入一个模板作为这个xsd:group。这甚至可能吗?
答案 0 :(得分:1)
@as
的值应包含XPATH sequence type
由于您构建了两个不同类型元素的序列,我相信您会使用element()*
,这表示模板将返回零个或多个元素。
您可以键入用于生成这些元素的各个模板/函数,并将它们限制为特定元素。对于intance,element(ProductType)?
表示零或一个 ProductType 元素。
<xsl:template name="ProductModel" as="element()*">
<xsl:call-template name="ProductType" />
<xsl:call-template name="ProductId" />
</xsl:template>
<xsl:template name="ProductType" as="element(ProductType)?">
<ProductType></ProductType>
</xsl:template>
<xsl:template name="ProductId" as="element(ProductId)?">
<ProductId></ProductId>
</xsl:template>
编辑:查看序列类型语法的详细信息,元素的定义是:
ElementTest :: =“element”“(” (ElementNameOrWildcard(“,”TypeName “?”?)?)? “)”
2.5.3 SequenceType Syntax下列出的其中一个示例:
element(*, po:address)
指的是 任何具有该名称的名称的元素节点 类型注释po:地址(或类型 源自po:地址)
因此,您可能能够执行以下操作(但可能需要架构感知处理器,如Saxon-EE):
<xsl:template name="ProductModel" as="element(*,fpml:Product.model)*">
<xsl:call-template name="ProductType" />
<xsl:call-template name="ProductId" />
</xsl:template>
<xsl:template name="ProductType" as="element(ProductType)?">
<ProductType></ProductType>
</xsl:template>
<xsl:template name="ProductId" as="element(ProductId)?">
<ProductId></ProductId>
</xsl:template>