Значение @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: адрес (или тип
происходит от 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>