0

很简单,是否可以键入 XSLT 模板或函数以返回命名序列构造函数?

例如,在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。这甚至可能吗?

4

1 回答 1

1

的值@as应该包含一个XPATH 序列类型

由于您正在构建由两种不同类型的元素组成的序列,我相信您会使用element()*,这表明模板将返回零次或多次出现的元素。

您可以键入用于生成这些元素的各个模板/函数,并将它们限制为特定元素。例如,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 name是一个QName

2.5.3 SequenceType Syntax下列出的示例之一:

element(*, po:address)指具有类型注释 po:address(或从 po:address 派生的类型)的任何名称的元素节点

因此,您可能能够执行以下操作(但它可能需要一个模式感知处理器,如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>
于 2010-02-22T01:45:59.660 回答