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

Posted

技术标签:

【中文标题】XSLT 循环排序将以下节点向上移动【英文标题】:XSLT Sort of Loops shifted some below nodes up 【发布时间】:2022-01-04 03:28:16 【问题描述】:

我的 XSLT 逻辑不工作。我们能否检查一下为什么它没有对 S5_Loop 进行排序但它将 L3 和 SE 部分移到 S5_Loop 上方。这是我正在使用的 XSL,它的版本为 1.0。我只能使用 1.0 版。这不是正确的输出,它应该对 S5_Loop 位进行排序,以保持其余字段在同一位置。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
 </xsl:template>
 
<xsl:template match="/ST_Loop">
    <xsl:copy>
        <xsl:apply-templates>
            <xsl:sort data-type="number" select="S5/S501"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>            

XML 输入

<?xml version="1.0" encoding="UTF-8"?>
<ST_Loop>
    <N1_Loop>
        <N1>
            <N101>CN</N101>
            <N102 GROUP            03</N102>
        </N1>
        <N3>
            <N301></N301>
        </N3>
        <N4>
            <N401>S</N401>
            <N403>-1300</N403>
            <N404>US</N404>
        </N4>
        <G61>
            <G6101>CN</G6101>
            <G6102> </G6102>
            <G6103>TE</G6103>
            <G6104>781-596-0345</G6104>
        </G61>
    </N1_Loop>
    <S5_Loop>
        <S5>
            <S501>1</S501>
            <S502>LD</S502>
        </S5>
        <G62>
            <G6202>200929</G6202>
            <G6204>010000</G6204>
        </G62>
        <N1_Loop>
            <N1>
                <N101>ford</N101>
            </N1>
            <N3>
                <N301>St</N301>
            </N3>
            <N4>
                <N401>ster</N401>
                <N403>-1656</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
    <S5_Loop>
        <S5>
            <S501>3</S501>
            <S502>LD</S502>
        </S5>
        <G62/>
        <N1_Loop>
            <N1>
                <N101>LLC</N101>
            </N1>
            <N3>
                <N301>Great Rd</N301>
            </N3>
            <N4>
                <N401>Qiddlesex</N401>
                <N403>-2802</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
    <S5_Loop>
        <S5>
            <S501>5</S501>
            <S502>LD</S502>
        </S5>
        <G62/>
        <N1_Loop>
            <N1>
                <N101></N101>
            </N1>
            <N3>
                <N301>St</N301>
            </N3>
            <N4>
                <N401>Rssex</N401>
                <N403>-3308</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
    <S5_Loop>
        <S5>
            <S501>2</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202>2021929</G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102></N102>
            </N1>
            <N3>
                <N301>297 Rd</N301>
            </N3>
            <N4>
                <N401>Bedfd</N401>
                <N402>MA</N402>
                <N403>-2802</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
    <S5_Loop>
        <S5>
            <S501>4</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202>2021029</G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102> &amp; , INC.        02</N102>
            </N1>
            <N3>
                <N301>13 Ell St</N301>
            </N3>
            <N4>
                <N401>Beer</N401>
                <N402>MA</N402>
                <N403>-3308</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
    <S5_Loop>
        <S5>
            <S501>6</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202></G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102></N102>
            </N1>
            <N3>
                <N301>450 Rd</N301>
            </N3>
            <N4>
                <N401></N401>
                <N402>MA</N402>
                <N403></N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
    <L3>
        <L301>KGM</L301>
        <L302>G</L302>
    </L3>
    <SE>
        <SE01>1</SE01>
        <SE02></SE02>
    </SE>
</ST_Loop>

输出

<ST_Loop>
    <N1_Loop>
        <N1>
            <N101>CN</N101>
            <N102></N102>
        </N1>
        <N3>
            <N301>450 Rd</N301>
        </N3>
        <N4>
            <N401></N401>
            <N403>-1300</N403>
            <N404>US</N404>
        </N4>
        <G61>
            <G6101>CN</G6101>
            <G6102> </G6102>
            <G6103>TE</G6103>
            <G6104></G6104>
        </G61>
    </N1_Loop>
    
    
    
    
    
    
    <L3>
        <L301>KGM</L301>
        <L302>G</L302>
    </L3>
    <SE>
        <SE01>1</SE01>
        <SE02></SE02>
    </SE>
<S5_Loop>
        <S5>
            <S501>1</S501>
            <S502>LD</S502>
        </S5>
        <G62>
            <G6202>200929</G6202>
            <G6204>010000</G6204>
        </G62>
        <N1_Loop>
            <N1>
                <N101></N101>
            </N1>
            <N3>
                <N301></N301>
            </N3>
            <N4>
                <N401></N401>
                <N403>-1656</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
   <S5_Loop>
        <S5>
            <S501>2</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202></G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102></N102>
            </N1>
            <N3>
                <N301>297 Rd</N301>
            </N3>
            <N4>
                <N401></N401>
                <N402>MA</N402>
                <N403>-2802</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
   <S5_Loop>
        <S5>
            <S501>3</S501>
            <S502>LD</S502>
        </S5>
        <G62/>
        <N1_Loop>
            <N1>
                <N101></N101>
            </N1>
            <N3>
                <N301>Rd</N301>
            </N3>
            <N4>
                <N401></N401>
                <N403>-2802</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
   <S5_Loop>
        <S5>
            <S501>4</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202>20210929</G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102></N102>
            </N1>
            <N3>
                <N301>St</N301>
            </N3>
            <N4>
                <N401></N401>
                <N402>MA</N402>
                <N403>-3308</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
   <S5_Loop>
        <S5>
            <S501>5</S501>
            <S502>LD</S502>
        </S5>
        <G62/>
        <N1_Loop>
            <N1>
                <N101></N101>
            </N1>
            <N3>
                <N301>t</N301>
            </N3>
            <N4>
                <N401>Rssex</N401>
                <N403>-3308</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
        <OID_Loop/>
    </S5_Loop>
   <S5_Loop>
        <S5>
            <S501>6</S501>
            <S502>UL</S502>
        </S5>
        <G62>
            <G6202></G6202>
            <G6204>040000</G6204>
        </G62>
        <LAD/>
        <N1_Loop>
            <N1>
                <N101>ST</N101>
                <N102></N102>
            </N1>
            <N3>
                <N301> Rd</N301>
            </N3>
            <N4>
                <N401></N401>
                <N402>MA</N402>
                <N403>-1300</N403>
                <N404>US</N404>
            </N4>
        </N1_Loop>
    </S5_Loop>
</ST_Loop>

【问题讨论】:

【参考方案1】:

目前,您的样式表没有指定特定的父级以按底层子级排序。通过指定 &lt;xsl:apply-templates/&gt; 而不指定 select 路径,您可以指示处理器复制当前节点的所有子节点和后代。但是,排序节点S5/S501 仅存在于&lt;S5_Loop&gt; 下。结果,没有 xpath 的其他节点返回空,因此默认升序首先排序。尝试添加order="descending" 并看到&lt;L3&gt;&lt;SE&gt; 将在底部!

要保留您的原始样式,请考虑重新设计&lt;ST_Loop&gt; 模板,方法是使用preceding-siblingfollowing-sibling 在其原始位置重新应用其他节点,并仅在S5_Loop 节点上运行排序。此外,考虑&lt;xsl:strip-space&gt; 删除节点之间的冗余空格,并考虑normalize-space(.) 所有文本节点上的删除文本值内的冗余空格。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  
  <xsl:template match="node()|@*">
       <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
       </xsl:copy>
   </xsl:template>
   
  <xsl:template match="ST_Loop">
      <xsl:copy>
          <xsl:apply-templates select="S5_Loop/preceding-sibling::*[name()!='S5_Loop']"/>
          <xsl:apply-templates select="S5_Loop">
              <xsl:sort data-type="number" select="S5/S501"/>
          </xsl:apply-templates>
          <xsl:apply-templates select="S5_Loop/following-sibling::*[name()!='S5_Loop']"/>
      </xsl:copy>
  </xsl:template>
  
  <xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)"/>
  </xsl:template>
  
</xsl:stylesheet>    

【讨论】:

这看起来与 N1_Loop 和 L3|SE 等预先确定的节点一起工作,如果数据节点是动态的和 S5_Loop 上下的可选节点,我们该怎么做。 查看使用 preceding-siblingfollowing-sibling 轴进行的编辑。 这是完美的解决方案,它奏效了。非常感谢。

以上是关于XSLT 循环排序将以下节点向上移动的主要内容,如果未能解决你的问题,请参考以下文章

ExtJS - 将 Treepanel 节点向上/向下移动代码

当在 Swift Spritekit 中触摸并按住屏幕时,我将如何向上移动我的节点?

整体向上移动,循环移动同样的数据

如何在 html 树中向上移动一个节点并提取链接?

自底向上的合并排序算法

将div向上移动其自身高度的50%