XSLT 中的 XSL 排序

Posted

技术标签:

【中文标题】XSLT 中的 XSL 排序【英文标题】:XSL sort in XSLT 【发布时间】:2020-10-01 22:02:13 【问题描述】:

我有这个脚本来计算产品的一些值。它工作完美。如何使用order="descending"<xsl:sort>

XML

<ITEM>
    <NAME>Lahůdková cibulka</NAME>
    <CODE>89</CODE>
    <AMOUNT>3</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Rané brambory 1 kg</NAME>
    <CODE>4</CODE>
    <AMOUNT>15</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Kapusta</NAME>
    <CODE>93</CODE>
    <AMOUNT>30</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Bílé zelí</NAME>
    <CODE>20</CODE>
    <AMOUNT>10</AMOUNT>
</ITEM>

我想按名称按字母顺序排序,如下所示:

首选 XML

<ITEM>
    <NAME>Bílé zelí</NAME>
    <CODE>20</CODE>
    <AMOUNT>10</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Kapusta</NAME>
    <CODE>93</CODE>
    <AMOUNT>30</AMOUNT>
<ITEM>
    <NAME>Lahůdková cibulka</NAME>
    <CODE>89</CODE>
    <AMOUNT>3</AMOUNT>
</ITEM>
<ITEM>
    <NAME>Rané brambory 1 kg</NAME>
    <CODE>4</CODE>
    <AMOUNT>15</AMOUNT>
</ITEM>

我使用这个 XSLT。排序参数放在哪里?

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="xml" omit-xml-declaration="no" indent="yes"/>
 <xsl:strip-space elements="*"/>
  <xsl:key name="itemkey" match="ITEM" use="concat(NAME, CODE)"/>
<xsl:template match="/ORDERS">
  <xsl:copy> 
      <xsl:apply-templates select="descendant::ITEM[generate-id() = generate-id(key('itemkey', concat(NAME, CODE))[1])]"/>
    </xsl:copy> 
  </xsl:template>
  <xsl:template match="ITEM">   
    <xsl:copy>      
        <xsl:variable name="curr-group" select="key('itemkey', concat(NAME, CODE))" />  
       <xsl:copy-of select="CODE|NAME"/>        
        <AMOUNT>         
            <xsl:value-of select="sum($curr-group/AMOUNT)"/>        
        </AMOUNT>       
    </xsl:copy>         
  </xsl:template>
</xsl:stylesheet>

非常感谢

【问题讨论】:

【参考方案1】:

xsl:sort 用作xsl:apply-templates 的子代:

<xsl:apply-templates select="descendant::ITEM[generate-id() = generate-id(key('itemkey', concat(NAME, CODE))[1])]">
  <xsl:sort select="NAME"/>
</xsl:apply-templates>

【讨论】:

谢谢。我试试这个,但之后有一些错误Warning: simplexml_load_file(): https://tisk.pesema.cz/zbozi/xml-patek.php:2: parser error : Extra content at the end of the document in /data/web/virtuals/76197/virtual/www/subdom/tisk/zbozi/zbozi_patek.php on line 3Warning: simplexml_load_file(): &lt;b&gt;Warning&lt;/b&gt;: DOMDocument::load(): Opening and ending tag mismatch: copy line in /data/web/virtuals/76197/virtual/www/subdom/tisk/zbozi/zbozi_patek.php on line 3Warning: simplexml_load_file(): ^ in /data/web/virtuals/76197/virtual/www/subdom/tisk/zbozi/zbozi_patek.php on line 3 我无法解释这一点,您发布的代码以及我在答案中建议的上述更改在xsltfiddle.liberty-development.net/3Mvnt3k 上运行良好。

以上是关于XSLT 中的 XSL 排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板

XSLT 3.0 中的日期排序

XSLT 循环排序将以下节点向上移动

使用 XSLT 对子元素进行排序

xslt for-each 和排序问题

XSL - 在变量中存储唯一和排序的数据