Вопрос о <xsl: sort> с использованием XSL 2.0 и расширений типов данных - PullRequest
1 голос
/ 31 августа 2010

Кто-нибудь знает пример определения типа данных с использованием схемы xml и использования его в шаблоне XSL с инструкцией xsl: sort

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 августа 2010

В качестве примера, который вы просили, предположим, что у нас есть файл схемы test2010083101Xsd.xml следующим образом:

<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="root">
    <xs:complexType>
      <xs:sequence maxOccurs="unbounded">
        <xs:element name="data" type="xs:double"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

входной XML-документ следующим образом:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test2010083101Xsd.xml">
  <data>2</data>
  <data>10</data>
  <data>1.5</data>
</root>

и таблица стилей XSLT 2.0 следующим образом:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:apply-templates select="root/data">
      <xsl:sort select="."/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="data">
    <xsl:value-of select="concat(., '&#10;')"/>
  </xsl:template>

</xsl:stylesheet>

затем при запуске этой таблицы стилей с помощью инструментов AltovaXML (процессор XSLT 2.0 с поддержкой схемы, учитывающий расположение xsi: noNamespaceSchemaLocation) с

AltovaXML.exe /xslt2 test2010083101Xsl.xml /in test2010083101.xml

вывод

1.5
2
10

, поэтому тип данных xs: double учитывается при сортировке элементов данных.

Когда вы запускаете ту же таблицу стилей для того же входного документа XML с процессором XSLT 2.0, который не поддерживает схемы (например, Saxon 9.2 Home Edition), то результат будет другим:

1.5
10
2

, как в этом случае значения сортируются как строки.

0 голосов
/ 31 августа 2010

В XSLT 2.0 атрибут data-type <xsl:sort> остается только для совместимости с XSLT 1.0.

Значения ключа сортировки сравниваются с помощью оператора сравнения значений lt,Это означает, что больше нет необходимости указывать тип «текст» или «число» в качестве значения атрибута data-type.Если тип выражения, определяющего ключ сортировки, равен xs:string, то используется оператор lt для xs:string.

Если тип ключа сортировки не является строкой или числом, ноимеет оператор lt, затем используется оператор lt для этого типа.Например, xs:date, xs:dateTime, ... и т. Д. Могут быть отсортированы правильно, и это не требует указания какого-либо значения для атрибута data-type.

Тип, определенный пользователем, вероятно,отсутствует определенный атрибут lt, что означает, что если ключи сортировки относятся к этому типу, операция сортировки завершится неудачей.

Конечно, в атрибуте select всегда можно указать выражение, котороессылка на xsl:function, которую пользователь специально предоставил для преобразования экземпляра пользовательского типа в тип с оператором lt.

...