2016-08-01 61 views
0

Dank der ausgezeichneten Antwort von Tim C in how transform from xml based on attributes to json and ignore the attributes from especific elements by using XSLT/XSL konnte ich lernen, wie ich mein Eingabe-XML in ein json transformiere und die Elementattribute während der Umwandlung ausschließe. Bitte beachten Sie die Eingabe-XML-Datei unten.Wie transformiere ich von xml nach json mit xsl und entferne die Element-/Datensatzbezeichnungen

Bitte, wie kann ich genau die gleiche Transformation aber ignorieren die "aa" und "bbb" in der Ausgabe json? Ich meine, wie schließe ich während der Xml-Transformation in Json die Datensatzbezeichner namens aa und bbb in meinem Fall aus?

In meiner realen Welt, aa wird immer zwei Ziffern (z. B. 99) für bestimmte Art von Artikeln stehen und BBB wird immer drei Ziffern (z. B. 999) für andere Art von Elementen stehen. Jedes Produkt ist eine Summe einiger aa plus irgendein bbb Art des Produktes. Da die Anzahl der Ziffern mir genau sagen, ob es ein Typ oder ein BBB-Typ ist, verstehe ich, dass ich eine Json-Otuput-Datei haben kann, die sowohl von json als auch von meinen Geschäftsperspektiven ein Ergebnis ohne "aa" und "bbb" Wörter erhält.

Eingabedatei:

<c:product xmlns:c="myapp"> 
     <c:item cod="789"> 
       <c:aa name="024" value="123"/> 
       <c:bbb name="0105" value="123456"/> 
       <c:bbb name="0122" value="T"/> 
       <c:aa name="071" value="00000001"/> 
     </c:item> 
     <c:item package="123" cod="11111"> 
       <c:aa name="002" value="753"/> 
       <c:aa name="003" value="456"/> 
       <c:bbb name="0146" value="147852"/> 
     </c:item> 
</c:product> 

meine aktuelle Ausgabedatei, wenn meine aktuelle XSL angewendet wird:

[ 
    { 
    "aa" : {"024":"123"}, 
    "bbb" : {"0105":"123456"}, 
    "bbb" : {"0122":"T"}, 
    "aa" : {"071":"00000001"} 
    }, 
    { 
    "aa" : {"002":"753"}, 
    "aa" : {"003":"456"}, 
    "bbb" : {"0146":"147852"} 
    } 
] 

meine aktuellen XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:c="myapp" exclude-result-prefixes="c"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*[c:item]"> 
    <xsl:text>[&#10;</xsl:text> 
    <xsl:apply-templates select="c:item"/> 
    <xsl:text>]&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="c:item"> 
    <xsl:text> {&#10;</xsl:text> 
     <xsl:apply-templates /> 
    <xsl:text> }</xsl:text> 
    <xsl:if test="following-sibling::c:item"> 
     <xsl:text>,</xsl:text> 
    </xsl:if> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="c:item/*"> 
     <xsl:text> "</xsl:text> 
     <xsl:value-of select="local-name()" /> 
     <xsl:text>" : {"</xsl:text> 
     <xsl:value-of select="@name" /> 
     <xsl:text>":"</xsl:text><xsl:value-of select="@value" /> 
     <xsl:text>"}</xsl:text> 
     <xsl:if test="following-sibling::*"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
     <xsl:text>&#10;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

meine gewünschte Ausgabe, dass ich es verstehen ist sowohl business als auch json muster gültig:

[ 
    { 
    {"024":"123"}, 
    {"0105":"123456"}, 
    {"0122":"T"}, 
    {"071":"00000001"} 
    }, 
    { 
    {"002":"753"}, 
    {"003":"456"}, 
    {"0146":"147852"} 
    } 
] 
+1

Ihre gewünschte Ausgabe ist nicht gültig JSON, glaube ich. Versuchen Sie es unter http://jsonlint.com/ zu validieren. –

+1

Möglicherweise möchten Sie etwas stattdessen ... http://xsltransform.net/jz1PuNH. Ich würde empfehlen, http://xsltransform.net zu verwenden, um Ihre XSLT zu testen, da Sie die Auswirkungen von Änderungen sofort sehen können. –

+0

Tim C, danke. Du hast meine Frage perfekt beantwortet. Wie kann ich darauf hinweisen, dass dies die endgültige Antwort ist: xsltransform.net/jz1PuNH? Kannst du hier als Antwort posten? –

Antwort

0

Die erwartete Ausgabe, die Sie geben, ist kein gültiger JSON. Vielleicht möchten Sie so etwas wie dieses

[ 
    { 
    "024":"123", 
    "0105":"123456", 
    "0122":"T", 
    "071":"00000001" 
    }, 
    { 
    "002":"753", 
    "003":"456", 
    "0146":"147852" 
    } 
] 

Mit diesem als Ihr Ziel ist es geradlinig die XSLT zu zwicken te gewünschten Ergebnisse zu erzielen. Die einzige Änderung besteht darin, die Vorlage zu ändern, die c:item/* entspricht, um die Ausgabe von local-name() (die den Namen der Elemente ausgibt; aaa, bb usw.) und die umgebenden Klammern zu entfernen.

dieses XSLT Versuchen:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
       xmlns:c="myapp" exclude-result-prefixes="c"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="*[c:item]"> 
    <xsl:text>[&#10;</xsl:text> 
    <xsl:apply-templates select="c:item"/> 
    <xsl:text>]&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="c:item"> 
    <xsl:text> {&#10;</xsl:text> 
     <xsl:apply-templates /> 
    <xsl:text> }</xsl:text> 
    <xsl:if test="following-sibling::c:item"> 
     <xsl:text>,</xsl:text> 
    </xsl:if> 
    <xsl:text>&#10;</xsl:text> 
</xsl:template> 

<xsl:template match="c:item/*"> 
     <xsl:text> "</xsl:text> 
     <xsl:value-of select="@name" /> 
     <xsl:text>":"</xsl:text><xsl:value-of select="@value" /> 
     <xsl:text>"</xsl:text> 
     <xsl:if test="following-sibling::*"> 
      <xsl:text>,</xsl:text> 
     </xsl:if> 
     <xsl:text>&#10;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

Zeit nehmen diese Antwort zu studieren, zu verstehen, was jeder Teil tut. Die Verwendung von http://xsltransform.net/ zum Ändern der XSLT würde helfen, da Sie dann leicht sehen können, was das Ergebnis jeder Änderung ist.