将XSLT模板/函数键入为序列构造函数?

时间:2010-02-15 12:12:30

标签: xslt xslt-2.0 fpml

很简单,是否可以键入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。这甚至可能吗?

1 个答案:

答案 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   “?”?)?)? “)”

第二个参数type nameQName

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>