Ввод шаблона / функции 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>