我必须通过属性
对我的xml中的某个节点和子节点进行排序和分组给出xml:
<Rechnung>
<somenodes />
<RechnungArtikelLieferinfos>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind vergriffen und leider nicht mehr nachlieferbar:" InfoTypKurztext="NICHT_NACHLIEFERBAR" InfoTyp="2">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="12345" Bestellmenge="1.00" Artikelbezeichnung="Angebotsblatt someone de" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind im Rückstand:" InfoTypKurztext="RÜCKSTAND" InfoTyp="3">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="12345" Bestellmenge="2.00" Artikelbezeichnung="Angebotsblatt someoneother de" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind vergriffen und leider nicht mehr nachlieferbar:" InfoTypKurztext="NICHT_NACHLIEFERBAR" InfoTyp="2">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="54321" Bestellmenge="2.00" Artikelbezeichnung="Angebotsblatt something de" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind im Rückstand:" InfoTypKurztext="NICHT_AUF_LAGER" InfoTyp="0">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="5555" Bestellmenge="1.00" Artikelbezeichnung="some article" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
</RechnungArtikelLieferinfos>
<somemorenodes />
</Rechnung>
RechnungArtikelLieferinfo将按其属性@Infotyp排序。在相同的RechnungArtikelLieferinfo @ Infotyp上,Artikelposition-Nodes应该被分组(我希望我在这里没有意义,英语不是我的第一语言)
预期结果:
<Rechnung>
<somenodes />
<RechnungArtikelLieferinfos>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind im Rückstand:" InfoTypKurztext="NICHT_AUF_LAGER" InfoTyp="0">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="5555" Bestellmenge="1.00" Artikelbezeichnung="some article" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind vergriffen und leider nicht mehr nachlieferbar:" InfoTypKurztext="NICHT_NACHLIEFERBAR" InfoTyp="2">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="12345" Bestellmenge="1.00" Artikelbezeichnung="Angebotsblatt someone de" Katalogkennzeichen="99"/>
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="something" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="54321" Bestellmenge="2.00" Artikelbezeichnung="Angebotsblatt something de" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
<RechnungArtikelLieferinfo InfoTypLangtext="Folgende Artikel sind im Rückstand:" InfoTypKurztext="RÜCKSTAND" InfoTyp="3">
<Artikelposition Absagekennzeichen="Allein im Rückstand" AbsagekennzeichenId="38" Artikeltyp="Beilage" ArtikeltypId="9" Zusatztextkennzeichen="" Zusatztext="" Bestellnummer="44444" Bestellmenge="2.00" Artikelbezeichnung="Angebotsblatt someoneother de" Katalogkennzeichen="99"/>
</RechnungArtikelLieferinfo>
</RechnungArtikelLieferinfos>
<somemorenodes />
</Rechnung>
我是XSL(T)的新手,并阅读了相关的一些文档。我想最好的方法就是使用XSLT 2.0及其分组选项(for-each-group),但是在阅读之后我有点迷失,比以前更加困惑。特别是因为所有教程都假设你必须重建结构,我只需要移动节点和子节点而不改变它们。
提前感谢您的帮助。
答案 0 :(得分:0)
这可以通过模板而不是每个循环(通常在XSLT中最好避免)轻松完成。
this XML Playground的Runnable演示(参见输出源)。
<!-- kick things off -->
<xsl:template match="Rechnung/RechnungArtikelLieferinfos">
<xsl:copy>
<xsl:apply-templates select='RechnungArtikelLieferinfo[not(preceding-sibling::RechnungArtikelLieferinfo/@InfoTyp = @InfoTyp)]'>
<xsl:sort select='@InfoTyp' data-type='number' />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<!-- RechnungArtikelLieferinfo nodes (unique only) -->
<xsl:template match='RechnungArtikelLieferinfo'>
<!-- copy node, and... -->
<xsl:copy>
<!-- ...its attributes/text -->
<xsl:copy-of select='@*|text()' />
<!-- ...any Artikelposition nodes of same parent @InfoTyp -->
<xsl:copy-of select='../RechnungArtikelLieferinfo[@InfoTyp = current()/@InfoTyp]/Artikelposition' />
</xsl:copy>
</xsl:template>