Пересмотр буквенно-цифровой сортировки по смешанному значению строки - PullRequest
2 голосов
/ 18 октября 2010

Обратите внимание, что я задал очень похожий вопрос ранее, но с тех пор требования изменились

Буквенно-цифровая сортировка по значению смешанной строки

Основное отличие в требованиях теперьчто исходный XML может включать в себя формы со всеми альфа-символами в form_name или со всеми целыми числами.

Form_name может быть открытым сезоном, поскольку буквы и цифры могут быть в любом порядке:

XX ## ##
XX XX ##
XX XX ###
XX XX ## ##
XX ###
XX XXXX
## XXX
XXX###
XXX
###

ДаноXML:

<forms>
<FORM lob="BO" form_name="AI OM 10"/>
<FORM lob="BO" form_name="CL BP 03 01"/>
<FORM lob="BO" form_name="AI OM 107"/>
<FORM lob="BO" form_name="CL BP 00 02"/>
<FORM lob="BO" form_name="123 DDE"/>
<FORM lob="BO" form_name="CL BP 00 02"/>
<FORM lob="BO" form_name="AI OM 98"/>
<FORM lob="BO" form_name="543 ZZE"/>
<FORM lob="BO" form_name="543 ABC"/>
<FORM lob="BO" form_name="256"/>
<FORM lob="BO" form_name="ABC"/>
</forms>  

Вывод должен быть:

<forms>
   <FORM lob="BO" form_name="256"/>
   <FORM lob="BO" form_name="123 DDE"/>
   <FORM lob="BO" form_name="543 ABC"/>
   <FORM lob="BO" form_name="543 ZZE"/>
   <FORM lob="BO" form_name="ABC"/>
   <FORM lob="BO" form_name="AI OM 10"/>
   <FORM lob="BO" form_name="AI OM 98"/>
   <FORM lob="BO" form_name="AI OM 107"/>
   <FORM lob="BO" form_name="CL BP 00 02"/>
   <FORM lob="BO" form_name="CL BP 00 02"/>
   <FORM lob="BO" form_name="CL BP 03 01"/>
</forms>

Результаты должны быть в следующем порядке:

  1. Формы только с целыми числами
  2. Формы, которые начинаются с целых чисел, но также содержат буквенные символы (могут содержать пробелы)
  3. Формы, содержащие только буквенные символы
  4. Формы, которые начинаются с буквенного символа, но также включают целые числаможет включать пробелы)

Таким образом, формы сгруппированы / отсортированы.Я пробовал различные улучшения ответов, представленных в моем предыдущем ссылочном вопросе, но не нашел правильного шаблона фильтрации для сортировки.Решения XSLT 2.0 хороши.

1 Ответ

0 голосов
/ 18 октября 2010

Это преобразование XSLT 1.0 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:variable name="vAlha" select=
  "' ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  "/>
 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <forms>
    <xsl:apply-templates select="*[floor(@form_name) = floor(@form_name)]">
      <xsl:sort data-type="number"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
      "*[substring-before(@form_name,' ')
       and
         translate(substring-before(@form_name,' '),
                   ' 0123456789',
                   '')
        =
         ''
        ]">
      <xsl:sort select="substring-before(@form_name,' ')" data-type="number"/>
      <xsl:sort select="substring-after(@form_name,' ')"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
    "*[translate(@form_name,$vAlha,'')
      =
      ''
       ]">
       <xsl:sort select="@form_name"/>
    </xsl:apply-templates>

    <xsl:apply-templates select=
    "*[contains($vAlha,substring(@form_name,1,1))
     and
       not(translate(@form_name, $vAlha, '') = '')
       ]">
       <xsl:sort select="translate(@form_name, ' 0123456789', '')"/>
       <xsl:sort select="translate(@form_name, $vAlha, '')" data-type="number"/>
    </xsl:apply-templates>
  </forms>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному XML-файлу :

<forms>
    <FORM lob="BO" form_name="AI OM 10"/>
    <FORM lob="BO" form_name="CL BP 03 01"/>
    <FORM lob="BO" form_name="AI OM 107"/>
    <FORM lob="BO" form_name="CL BP 00 02"/>
    <FORM lob="BO" form_name="123 DDE"/>
    <FORM lob="BO" form_name="CL BP 00 02"/>
    <FORM lob="BO" form_name="AI OM 98"/>
    <FORM lob="BO" form_name="543 ZZE"/>
    <FORM lob="BO" form_name="543 ABC"/>
    <FORM lob="BO" form_name="256"/>
    <FORM lob="BO" form_name="ABC"/>
</forms>

производитжелаемый результат :

<forms>
    <FORM lob="BO" form_name="256"></FORM>
    <FORM lob="BO" form_name="123 DDE"></FORM>
    <FORM lob="BO" form_name="543 ABC"></FORM>
    <FORM lob="BO" form_name="543 ZZE"></FORM>
    <FORM lob="BO" form_name="ABC"></FORM>
    <FORM lob="BO" form_name="AI OM 10"></FORM>
    <FORM lob="BO" form_name="AI OM 98"></FORM>
    <FORM lob="BO" form_name="AI OM 107"></FORM>
    <FORM lob="BO" form_name="CL BP 00 02"></FORM>
    <FORM lob="BO" form_name="CL BP 00 02"></FORM>
    <FORM lob="BO" form_name="CL BP 03 01"></FORM>
</forms>
...