2017-02-27 4 views
0

Ich versuche eine XML-Datei zu erstellen und sie mit XSLT zu konvertieren.
Die XML Ich versuche, sieht wie folgt zu konvertieren:XSLT-1.0: Konvertiere kommagetrennte Werte in Elementwerte

<root> 
    <TAG>10, 1, 3, 123, 4001, 34, 200, 105, 54, 0, 0, 0</TAG> 
</root> 

Wenn ich die Umwandlung laufen, ich das Ergebnis wie folgt angezeigt werden soll:

<Field1>10</Field1> 
<Field2>1</Field2> 
... 
<Field12>0</Field12> 

Allerdings ist meine XSLT-Datei nicht funktioniert wie entworfen.
Immer, wenn ich den Konverter laufen, bekomme ich wieder diese als Antwort:

<Field_1> 
    <TAG>10, 1, 3, 123, 4001, 34, 200, 105, 54, 0, 0, 0</TAG> 
</Field_1> 

Hier ist meine XSLT-Datei:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:kml="http://www.opengis.net/kml/2.2" version="1.0"> 
<xsl:strip-space elements = "*"/> 
<xsl:output method = "xml" indent = "yes"/> 

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

<xsl:template match="root"> 
    <xsl:call-template name="listItem"> 
     <xsl:with-param name="tag" select="TAG"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="listItem"> 
    <xsl:param name="features"/> 
    <xsl:choose> 
     <xsl:when test="contains($features, ',')"> 
      <xsl:element name="Field_{position()}"> 
       <xsl:apply-templates select="@*|node()"/> 
       <xsl:value-of select="normalize-space(substring-before($features, ','))"/> 
       <xsl:variable name="nextValue" select="substring-after($features, ',')"/> 
      </xsl:element> 
      <xsl:if test="normalize-space($nextValue)"> 
       <xsl:call-template name="listItem"> 
        <xsl:with-param name="features" select="$nextValue"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="Field_{position()}"> 
       <xsl:apply-templates select="@*|node()"/> 
       <xsl:value-of select="$features"/> 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

Hat jemand irgendwelche Vorschläge, wie meine XSLT-Datei erhalten zu konvertieren mein XML in das gewünschte Ergebnis?
Bitte und danke für Ihre Hilfe.

Antwort

0

Verwenden Sie dieses XSLT.
Es ist XSLT Version 1.0 und verwendet Rekursion über einen Namen <xsl:template> namens field, um die durch Komma getrennten Werte zu begrenzen und jeden der Werte in <Field> Elemente einzukapseln. Der Name des Elements wird aus der statischen Zeichenfolge Field plus einer rekursiv übergebenen Variablen mit dem Namen cnt generiert.

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 

    <xsl:template match="/root"> 
    <root> 
     <xsl:call-template name="field"> 
     <xsl:with-param name="cnt" select="1" /> 
     <xsl:with-param name="txt" select="concat(TAG/text(),',')" /> 
     </xsl:call-template> 
    </root> 
</xsl:template> 

    <xsl:template name="field"> 
    <xsl:param name="cnt" /> 
    <xsl:param name="txt" /> 
    <xsl:element name="{concat('Field',$cnt)}"> 
     <xsl:value-of select="normalize-space(substring-before($txt,','))"/> 
    </xsl:element> 
    <xsl:if test="normalize-space(substring-after($txt,',')) != ''"> 
     <xsl:call-template name="field"> 
     <xsl:with-param name="cnt" select="$cnt + 1" /> 
     <xsl:with-param name="txt" select="substring-after($txt,',')" /> 
     </xsl:call-template> 
    </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

Das Ergebnis - wie gewünscht - ist:

<?xml version="1.0"?> 
<root> 
    <Field1>10</Field1> 
    <Field2>1</Field2> 
    <Field3>3</Field3> 
    <Field4>123</Field4> 
    <Field5>4001</Field5> 
    <Field6>34</Field6> 
    <Field7>200</Field7> 
    <Field8>105</Field8> 
    <Field9>54</Field9> 
    <Field10>0</Field10> 
    <Field11>0</Field11> 
    <Field12>0</Field12> 
</root> 
+0

Thank you! Arbeitete perfekt. –

Verwandte Themen