Ввод шаблона / функции XSLT в качестве конструктора последовательности? - PullRequest
0 голосов
/ 15 февраля 2010

Очень просто, можно ли набрать шаблон или функцию 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 Ответ

1 голос
/ 22 февраля 2010

Значение @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>
...