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> & , 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】:目前,您的样式表没有指定特定的父级以按底层子级排序。通过指定 <xsl:apply-templates/>
而不指定 select
路径,您可以指示处理器复制当前节点的所有子节点和后代。但是,排序节点S5/S501
仅存在于<S5_Loop>
下。结果,没有 xpath 的其他节点返回空,因此默认升序首先排序。尝试添加order="descending"
并看到<L3>
和<SE>
将在底部!
要保留您的原始样式,请考虑重新设计<ST_Loop>
模板,方法是使用preceding-sibling
和following-sibling
在其原始位置重新应用其他节点,并仅在S5_Loop
节点上运行排序。此外,考虑<xsl:strip-space>
删除节点之间的冗余空格,并考虑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-sibling
和 following-sibling
轴进行的编辑。
这是完美的解决方案,它奏效了。非常感谢。以上是关于XSLT 循环排序将以下节点向上移动的主要内容,如果未能解决你的问题,请参考以下文章
ExtJS - 将 Treepanel 节点向上/向下移动代码