XSLT: сортировка товаров по нескольким характеристикам - PullRequest
0 голосов
/ 01 апреля 2020

Я бы хотел отсортировать все разделы по периодам (месяц, день, неделя, год ...). Сомме раздел имеют тот же период. я не понимаю, как добавить различия года и месяца

У меня есть XML данные, такие как:

<?xml version='1.0' encoding='UTF-8'?>
    <chapter>

<title>Title of chapter </title>

<section>
<title> Title of section 2</title>
<para>Period is 2 year </para>
</section>
<section>
<title> Title of section 1</title>
<para>Period is 1 year </para>
</section>
<section>
<title> Title of section 3</title>
<para>Period is 1 week </para>
</section>
<section>
<title> Title of section 4</title>
<para>Period is 1 year </para>
</section>

</chapter>

И мне нужен результат, как:

<?xml version='1.0' encoding='UTF-8'?>
<chapter>

<title>Title of chapter </title>
<section>
<title> List elem of 1 week</title>
<section>
<title> Title of section 3</title>
<para>Period is 1 week </para>
</section>
</section>

<section>
<title> List elem of 1 year</title>
<section>
<title> Title of section 1</title>
<para>Period is 1 year </para>
</section>
<section>
<title> Title of section 4</title>
<para>Period is 1 year </para>
</section>
</section>

<section>
<title> List elem of 2 years </title>
<section>
<title> Title of section 2</title>
<para>Period is 2 years </para>
</section>
</section>

</chapter>

И мой XSLT выглядит так:

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

    <xsl:strip-space elements="*"/>
    <xsl:template match="node(  ) | @*"> 
        <xsl:copy>  
            <xsl:apply-templates select="@* | node(  )"/>  
        </xsl:copy>
    </xsl:template>     
    <xsl:variable name="liste_valeurs" select="//para[not(. = preceding::para)]"/>

    <xsl:template match="chapter">
        <xsl:copy> 

            <xsl:copy-of select="@*"/>
                <xsl:for-each select="$liste_valeurs">
                    <xsl:sort select="." data-type="number"/>
                    <xsl:variable name="valeur" select="."/>
                    <xsl:element name="section">
                        <title> List elem of <xsl:value-of select="$valeur"/></title>           
                        <xsl:apply-templates select="//para[.=$valeur]">
                            <xsl:call-template name="copie_identique"/>                             
                        </xsl:apply-templates>
                    </xsl:element>                  

                </xsl:for-each>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="copie_identique">
        <xsl:copy> 
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates/>
        </xsl:copy> 
    </xsl:template>

</xsl:stylesheet>

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

Я не знаю, где go, и, возможно, метод не лучший способ достичь того, чего я хочу.

Спасибо за любую помощь, которую вы можете оказать,

1 Ответ

0 голосов
/ 01 апреля 2020

Это не просто. Рассмотрим следующий пример:

XML

<chapter>
  <title>Title of chapter </title>
  <section>
    <title> Title of section 1</title>
    <para>Period is 2 years </para>
  </section>
  <section>
    <title> Title of section 2</title>
    <para>Period is 3 weeks </para>
  </section>
  <section>
    <title> Title of section 3</title>
    <para>Period is 10 months </para>
  </section>
  <section>
    <title> Title of section 4</title>
    <para>Period is 1 year </para>
  </section>
  <section>
    <title> Title of section 5</title>
    <para>Period is 1 week </para>
  </section>
  <section>
    <title> Title of section 6</title>
    <para>Period is 2 months </para>
  </section>
</chapter>

XSLT 1.0

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

<xsl:template match="chapter">
    <xsl:copy> 
        <xsl:copy-of select="title"/>
            <xsl:for-each select="section">
                <xsl:sort select="number(contains(para, 'week'))" data-type="number" order="descending"/>
                <xsl:sort select="number(contains(para, 'month'))" data-type="number" order="descending"/>
                <xsl:sort select="number(contains(para, 'year'))" data-type="number" order="descending"/>
                <xsl:sort select="translate(para, translate(para, '0123456789', ''), '')" data-type="number"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<chapter>
  <title>Title of chapter </title>
  <section>
    <title> Title of section 5</title>
    <para>Period is 1 week </para>
  </section>
  <section>
    <title> Title of section 2</title>
    <para>Period is 3 weeks </para>
  </section>
  <section>
    <title> Title of section 6</title>
    <para>Period is 2 months </para>
  </section>
  <section>
    <title> Title of section 3</title>
    <para>Period is 10 months </para>
  </section>
  <section>
    <title> Title of section 4</title>
    <para>Period is 1 year </para>
  </section>
  <section>
    <title> Title of section 1</title>
    <para>Period is 2 years </para>
  </section>
</chapter>

Если вы хотите сгруппировать section s по para, то изучите мюнхенский метод .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...