2017-04-07 6 views
0

Angesichts die folgende XML-Datei Text:XSLT Art mit Zahlen arbeiten, aber nicht

<?xml version="1.0"?> 
<mappings> 
<mapping> 
    <class-a>C</class-a> 
    <class-b>a</class-b> 
</mapping> 
<mapping> 
    <class-a>B</class-a> 
    <class-b>b</class-b> 
</mapping> 
<mapping> 
    <class-a>A</class-a> 
    <class-b>c</class-b> 
</mapping> 
</mappings> 

Und folgende XSLT-Datei:

<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:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="mappings"> 
    <xsl:copy> 
    <xsl:apply-templates> 
      <xsl:sort select="(name() = 'mapping')*class-a" data-type="text" order="ascending" /> 
    </xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

Erzeugt dieses schlechte XML-Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<mappings> 
    <mapping> 
     <class-a>C</class-a> 
     <class-b>a</class-b> 
    </mapping> 
    <mapping> 
     <class-a>B</class-a> 
     <class-b>b</class-b> 
    </mapping> 
    <mapping> 
     <class-a>A</class-a> 
     <class-b>c</class-b> 
    </mapping> 
</mappings> 

Erwartete Ergebnis ist:

<?xml version="1.0" encoding="UTF-8"?> 
<mappings> 
    <mapping> 
     <class-a>A</class-a> 
     <class-b>c</class-b> 
    </mapping> 
    <mapping> 
     <class-a>B</class-a> 
     <class-b>b</class-b> 
    </mapping> 
    <mapping> 
     <class-a>C</class-a> 
     <class-b>a</class-b> 
    </mapping> 
</mappings> 

Zuordnungen sollten alphabetisch nach class-a Elementwerten sortiert werden.

von Zahlen anstelle von Strings in class-a Elemente von XML-Eingabe mit:

<?xml version="1.0"?> 
<mappings> 
<mapping> 
    <class-a>3</class-a> 
    <class-b>a</class-b> 
</mapping> 
<mapping> 
    <class-a>2</class-a> 
    <class-b>b</class-b> 
</mapping> 
<mapping> 
    <class-a>1</class-a> 
    <class-b>c</class-b> 
</mapping> 
</mappings> 

mit entweder data-type="text" oder data-type="number" in XSLT Art-Tag, wir werden immer das gleiche erwartete Ergebnis:

<?xml version="1.0" encoding="UTF-8"?> 
<mappings> 
    <mapping> 
     <class-a>1</class-a> 
     <class-b>c</class-b> 
    </mapping> 
    <mapping> 
     <class-a>2</class-a> 
     <class-b>b</class-b> 
    </mapping> 
    <mapping> 
     <class-a>3</class-a> 
     <class-b>a</class-b> 
    </mapping> 
</mappings> 

Weiß jemand, wie man das Ergebnis auch mit Text erwartet?

+0

Was bedeutet '(name() = 'mapping') * class-a '? '' erwartet XPath, dies ist kein XPath. – Tomalak

+1

Ich bin mir nicht sicher, dass dies wirklich XPath ist, fand es aber aus akzeptierter Antwort: [link] (http://stackoverflow.com/questions/2878809/xml-and-xslt-need-it-to-sort-only- bestimmte-Kind-Knoten) – ma3j

+0

Ohh, ich verstehe. Das ist nicht anwendbar auf Ihre Situation. Sie möchten einfach nach Klasse-a sortieren, genau wie @Rupesh es vorschlägt. – Tomalak

Antwort

1

ich endlich herausgefunden, wie erwartetes Ergebnis zu erhalten:

<xsl:sort select="class-a[name(..) = 'mapping']" data-type="text" />

@Tomalak: danke, setzen Sie mich auf dem richtigen Weg!

@Rupesh: Ihre Lösung funktioniert gut für einfache Fälle (einschließlich dem gegebenen Beispiel), aber erlaubt nicht nur <mapping> Elemente zu sortieren, wenn es auch andere Arten von Elementen innerhalb des <mappings> Tag sind mit sich <class-a> Subelemente ...

+0

'class-a [Name (..) = 'Mapping']' ist das gleiche wie 'Klasse-a [../ Mapping]'. Allgemeinerer Tipp für Ihre nächste Frage: Fügen Sie Ihrer Probe auch die Randfälle hinzu. – Tomalak

+0

@Tomalak Danke für die Verknüpfung. Ok ich werde versuchen nächstes mal genauer zu sein;) – ma3j

1

Sie können dies versuchen:

 <xsl:sort select="class-a" data-type="text" order="ascending" /> 
Verwandte Themen