使用 XML 中的多列进行 XSLT 排序
Posted
技术标签:
【中文标题】使用 XML 中的多列进行 XSLT 排序【英文标题】:XSLT sort using multiple columns in XML 【发布时间】:2018-11-10 20:42:34 【问题描述】:我的 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>
【问题讨论】:
我想知道如何创建一个 xslt 来获得这个输出 ***.com/q/16302049/1531971 Sort XML to XML using XSLT的可能重复 OP 要求多个排序键,而不是一般的排序。可以看看xml.com/pub/a/2002/07/03/transform.html 感谢 Adrain,但我已经看过这篇文章,但找不到任何适合我的情况 【参考方案1】:试试这个 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>
【讨论】:
以上是关于使用 XML 中的多列进行 XSLT 排序的主要内容,如果未能解决你的问题,请参考以下文章
如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序