Пользовательский порядок сортировки строк - PullRequest
0 голосов
/ 21 мая 2019

Как я могу применить пользовательскую сортировку для сортировки следующего?

<maps>
  <domain>pics.siteB.com</domain>
  <domain>subdomain1.siteA.com</domain>
  <domain>pics.siteA.org</domain>
  <domain>validdomain</domain>
  <domain>siteD.com</domain>
  <domain>sub-subdomain4.subdomain.siteC.com</domain>
  <domain>sub-subdomain1.subdomain.siteC.com</domain>
  <domain>subdomain1.siteA.net</domain>
<maps>

Я попытался выполнить следующее, затем он странным образом сортируется и удаляет запись, когда разделитель недоступен.

<xsl:apply-templates select="*">
  <!-- using <xsl:variable> throws error here -->
  <xsl:sort select="string-join(reverse(tokenize(domain, '\.')[position() lt last()]), '.')"></xsl:sort>
</xsl:apply-templates>

Ожидаемый результат:

  1. Получить последний, кроме одного токена, например siteA, siteB, siteC и т. Д.
  2. Получить последний токен после разделителя, например, com, net, org и т. Д.
  3. Поменяйте местами остальные жетоны до последнего, кроме 2, например pics, subdomain1, sub-subdomain1.subdomain и т. Д.
  4. Сортировать по этому тексту
<maps>
  <domain>subdomain1.siteA.com</domain>
  <domain>subdomain1.siteA.net</domain>
  <domain>pics.siteA.org</domain>
  <domain>pics.siteB.com</domain>
  <domain>sub-subdomain1.subdomain.siteC.com</domain>
  <domain>sub-subdomain4.subdomain.siteC.com</domain>
  <domain>siteD.com</domain>
  <domain>validdomain</domain>
<maps>

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

1 Ответ

0 голосов
/ 22 мая 2019

Предполагая, что строки, по которым вы хотите отсортировать домены:

<domain>siteB com pics</domain>
<domain>siteA com subdomain1</domain>
<domain>siteA org pics</domain>
<domain>validdomain</domain>
<domain>siteD com</domain>
<domain>siteC com subdomain sub-subdomain4</domain>
<domain>siteC com subdomain sub-subdomain1</domain>
<domain>siteA net subdomain1</domain>

, вы можете использовать:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/maps">
    <xsl:copy>
        <xsl:for-each select="domain">
            <xsl:sort>
                <xsl:variable name="tokens" select="tokenize(., '\.')" />
                <xsl:value-of select="$tokens[position() ge last() - 1], reverse($tokens[position() lt last() - 1])"/>
            </xsl:sort>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

, чтобы получить результат, показанный в вашем вопросе.


Демо : https://xsltfiddle.liberty -development.net / bFN1y9F

...