Ввод шаблона / функции XSLT в качестве конструктора последовательности?

Очень просто, можно ли набрать шаблон или функцию XSLT для возврата именованного конструктора последовательности?

например, в FpML есть группа Product.model, которая просто содержит два элемента (ProductType и ProductId). Я хотел бы иметь возможность создать типизированный шаблон, который возвращает эту последовательность, но не знаю, что должен содержать атрибут "как".

Обновить

Для удобства я добавлю соответствующий фрагмент схемы 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 ответ

Значение @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 "?"?)?)? ")"

Второй параметр, имя типа, является QName

Один из примеров, перечисленных в разделе 2.5.3 Синтаксис SequenceType:

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>
Другие вопросы по тегам