XSLT сортировка с использованием нескольких столбцов в XML - PullRequest
0 голосов
/ 31 мая 2018

Мой XML выглядит так -

    <?xml version='1.0' encoding='UTF-8'?>
<root>
    <row>
        <col1>Plan ID</col1>
        <col2>472064672</col2>
        <col3>18007</col3>
        <col4>1</col4>
        <col5>MARGARET</col5>
        <col6>PRESLEY</col6>
        <col7>20161216</col7>
        <col8/>
        <col9/>
        <col10>Pre-Tax </col10>
        <col11/>
        <col12>750</col12>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180501</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>Plan ID</col1>
        <col2>472064672</col2>
        <col3>18007</col3>
        <col4>1</col4>
        <col5>MARGARET</col5>
        <col6>PRESLEY</col6>
        <col7>20161216</col7>
        <col8/>
        <col9/>
        <col10>Pre-Tax Defrl%</col10>
        <col11>0</col11>
        <col12/>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180501</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>Plan ID</col1>
        <col2>214196103</col2>
        <col3/>
        <col4>1</col4>
        <col5>PETER</col5>
        <col6>JOHNSON</col6>
        <col7/>
        <col8/>
        <col9/>
        <col10>Pre-Tax </col10>
        <col11/>
        <col12>0</col12>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180502</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>Plan ID</col1>
        <col2>214196103</col2>
        <col3/>
        <col4>1</col4>
        <col5>PETER</col5>
        <col6>JOHNSON</col6>
        <col7/>
        <col8/>
        <col9/>
        <col10>Pre-Tax Defrl%</col10>
        <col11>16.29</col11>
        <col12/>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180502</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
</root>

Я хочу отсортировать этот XML так, чтобы для каждой группы значений col2, xml должен быть отсортирован так, что если col11 имеет значение 0, а col12 пустое, тосначала идет строка, у которой col11 или col12 равны 0, а затем строки с ненулевым значением в col11 или col12.

Так что мой вывод будет выглядеть так -

    <root>
      <row>
        <col1>666919</col1>
        <col2>214196103</col2>
        <col3/>
        <col4>1</col4>
        <col5>PETER</col5>
        <col6>JOHNSON</col6>
        <col7/>
        <col8/>
        <col9/>
        <col10>Pre-Tax </col10>
        <col11/>
        <col12>0</col12>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180502</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>666919</col1>
        <col2>214196103</col2>
        <col3/>
        <col4>1</col4>
        <col5>PETER</col5>
        <col6>JOHNSON</col6>
        <col7/>
        <col8/>
        <col9/>
        <col10>Pre-Tax Defrl%</col10>
        <col11>16.29</col11>
        <col12/>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180502</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>666919</col1>
        <col2>472064672</col2>
        <col3>18007</col3>
        <col4>1</col4>
        <col5>MARGARET</col5>
        <col6>PRESLEY</col6>
        <col7>20161216</col7>
        <col8/>
        <col9/>
        <col10>Pre-Tax Defrl%</col10>
        <col11>0</col11>
        <col12/>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180501</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
    <row>
        <col1>666919</col1>
        <col2>472064672</col2>
        <col3>18007</col3>
        <col4>1</col4>
        <col5>MARGARET</col5>
        <col6>PRESLEY</col6>
        <col7>20161216</col7>
        <col8/>
        <col9/>
        <col10>Pre-Tax </col10>
        <col11/>
        <col12>750</col12>
        <col13/>
        <col14/>
        <col15/>
        <col16/>
        <col17/>
        <col18/>
        <col19/>
        <col20/>
        <col21/>
        <col22/>
        <col23/>
        <col24/>
        <col25/>
        <col26/>
        <col27/>
        <col28> </col28>
        <col29/>
        <col30>20180501</col30>
        <col31>2</col31>
        <col32/>
        <col33/>
        <col34/>
    </row>
</root>

1 Ответ

0 голосов
/ 01 июня 2018

Попробуйте это XSLT.Это проверяет, является ли col11 нулевым или пустым, тогда логическое выражение будет ложным, то есть оно будет отсортировано первым.И аналогично для col12

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

  <xsl:template match="@*|node()">
      <xsl:copy>
          <xsl:apply-templates select="@*|node()" />
      </xsl:copy>
  </xsl:template>

  <xsl:template match="root">
    <xsl:copy>
        <xsl:apply-templates select="row">
            <xsl:sort select="col2" />
            <xsl:sort select="boolean(number(col11))" />
            <xsl:sort select="boolean(number(col12))" />
        </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...