Sortowanie XSLT - jak sortować węzły potomne xml wewnątrz węzła nadrzędnego z atrybutem
To, co zaczęło się jako prosta rzecz, okazało się dość kłopotliwe dla XSLT noob.
Próbuję posortować childnodes / descending, ale po dodaniu atrybutu do węzła nadrzędnego otrzymuję błąd podczas debugowania w VS2010:
"Attribute and namespace nodes cannot be added to the parent element after a text, comment, pi, or sub-element node has already been added."
Załóżmy, że mam ten prosty XML:
<posts>
<year value="2013">
<post postid="10030" postmonth="1">
<othernode></othernode>
<othernode2></othernode2>
</post>
<post postid="10040" postmonth="2">
<othernode></othernode>
<othernode2></othernode2>
</post>
<post postid="10050" postmonth="3">
<othernode></othernode>
<othernode2></othernode2>
</post>
</year>
<year value="2012">
<post postid="10010" postmonth="1">
<othernode></othernode>
<othernode2></othernode2>
</post>
<post postid="10015" postmonth="2">
<othernode></othernode>
<othernode2></othernode2>
</post>
<post postid="10020" postmonth="3">
<othernode></othernode>
<othernode2></othernode2>
</post>
</year>
</posts>
Przekazuję XPATH do xmldatasource, aby pobrać odpowiednie<year>
węzeł, np. 2013. Potem muszę posortować swoje dziecko<post>
węzły malejące za pomocą postid, więc<year value=2013>
, postid = 10050 pojawiłby się jako pierwszy po renderowaniu.
Żeby było jasne: interesuje mnie tylko sortowanie w jednym<year>
węzeł.
Zanim podzielę węzły na osobne węzły (tj. Xml był / posts / post) działało następujące XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:sort select="@postid" data-type="text" order="descending"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Teraz xmldatasource jest pusty podczas uruchamiania z powodu powyższego błędu. Jeśli przejdę rosnąco do zamówienia, oczywiście zwracany jest ten sam plik xml (bez transformacji)
Pytanie: jak zaktualizować powyższy XSLT (lub nowy), aby uwzględnić atrybut węzła nadrzędnego (<year value="">
)? Dzięki badaniom odpowiedź mówi: „Muszę dodać tworzenie atrybutów przed utworzeniem elementu”. Ma to sens, ponieważ oglądanie debuggera powoduje utworzenie potomków w kolejności desc, ale znacznik roku nie zawiera jego atrybutu. Ale nie mam pojęcia o XSLT. Nie widzę tego jako zbyt skomplikowanego, ale po prostu nie znam języka.
Każda pomoc, bardzo mile widziana. Dzięki