2017-09-06 4 views
0

Saxonne J'utilise XSLT 3.0 pour transformer ce document JSON à ce document XML avec la fonction JSON-à-xml,JSON XML avec XSLT 3.0 en utilisant

<xsl:variable name="input-as-xml" select="json-to-xml(.)"/> 

De ce que je passe Saxonne JSON comme le document XML:

String XML = "<root>" + JSON + "</root>"; 

je reçois un XML quand appeler la fonction JSON-à-xml:

<?xml version="1.0" encoding="utf-8"?> 
<map 
    xmlns="http://www.w3.org/2005/xpath-functions"> 
    <string key="_D">urn:oasis:names:specification:ubl:schema:xsd:Invoice-2</string> 
    <string key="_S">urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2</string> 
    <string key="_B">urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2</string> 
    <array key="Invoice"> 
     <map> 
      <array key="ID"> 
       <map> 
        <string key="IdentifierContent">123</string> 
       </map> 
      </array> 
      <array key="IssueDate"> 
       <map> 
        <string key="DateContent">2011-09-22</string> 
       </map> 
      </array> 
      <array key="InvoicePeriod"> 
       <map> 
        <array key="StartDate"> 
         <map> 
          <string key="DateContent">2011-08-01</string> 
         </map> 
        </array> 
        <array key="EndDate"> 
         <map> 
          <string key="DateContent">2011-08-31</string> 
         </map> 
        </array> 
       </map> 
      </array> 
      <array key="AccountingSupplierParty"> 
       <map> 
        <array key="Party"> 
         <map> 
          <array key="PartyName"> 
           <map> 
            <array key="Name"> 
             <map> 
              <string key="TextContent">Custom Cotter Pins</string> 
             </map> 
            </array> 
           </map> 
          </array> 
         </map> 
        </array> 
       </map> 
      </array> 
      <array key="AccountingCustomerParty"> 
       <map> 
        <array key="Party"> 
         <map> 
          <array key="PartyName"> 
           <map> 
            <array key="Name"> 
             <map> 
              <string key="TextContent">North American Veeblefetzer</string> 
             </map> 
            </array> 
           </map> 
          </array> 
         </map> 
        </array> 
       </map> 
      </array> 
      <array key="LegalMonetaryTotal"> 
       <map> 
        <array key="PayableAmount"> 
         <map> 
          <number key="AmountContent">100.00</number> 
          <string key="AmountCurrencyIdentifier">CAD</string> 
         </map> 
        </array> 
       </map> 
      </array> 
      <array key="InvoiceLine"> 
       <map> 
        <array key="ID"> 
         <map> 
          <string key="IdentifierContent">1</string> 
         </map> 
        </array> 
        <array key="LineExtensionAmount"> 
         <map> 
          <number key="AmountContent">100.00</number> 
          <string key="AmountCurrencyIdentifier">CAD</string> 
         </map> 
        </array> 
        <array key="Item"> 
         <map> 
          <array key="Description"> 
           <map> 
            <string key="TextContent">Cotter pin, MIL-SPEC</string> 
           </map> 
          </array> 
         </map> 
        </array> 
       </map> 
      </array> 
     </map> 
    </array> 
</map> 

Est-il correct de passer ce XML en paramètre?

<xsl:apply-templates select="$input-as-xml" /> 

S'il vous plaît, toute suggestion dans la façon dont je peux utiliser des modèles pour transformer le XML que je veux? Je veux juste quelques suggestions.

Répondre

1

Les informations sur les préfixes ne semble pas être inclus dans le JSON j'ai donc décidé de les déclarer en tant que paramètres et je vous ai pris connaissez le nom/clé de l'élément pour commencer (par exemple Invoice):

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    xmlns:fn="http://www.w3.org/2005/xpath-functions" 
    exclude-result-prefixes="xs math fn" 
    version="3.0"> 

    <xsl:param name="json-input" as="xs:string">{"_D":"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2", 
     "_S":"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2", 
     "_B":"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2", 
     "Invoice":[{ 
     "ID":[{"IdentifierContent":"123"}], 
     "IssueDate":[{"DateContent":"2011-09-22"}], 
     "InvoicePeriod":[{ 
     "StartDate":[{"DateContent":"2011-08-01"}], 
     "EndDate":[{"DateContent":"2011-08-31"}] 
     }], 
     "AccountingSupplierParty":[{ 
     "Party":[{ 
     "PartyName":[{ 
     "Name":[{"TextContent":"Custom Cotter Pins"}] 
     }] 
     }] 
     }], 
     "AccountingCustomerParty":[{ 
     "Party":[{ 
     "PartyName":[{ 
     "Name":[{"TextContent":"North American Veeblefetzer"}] 
     }] 
     }] 
     }], 
     "LegalMonetaryTotal":[{ 
     "PayableAmount":[{"AmountContent":100.00, 
     "AmountCurrencyIdentifier":"CAD"}] 
     }], 
     "InvoiceLine":[{ 
     "ID":[{"IdentifierContent":"1"}], 
     "LineExtensionAmount":[{"AmountContent":100.00, 
     "AmountCurrencyIdentifier":"CAD"}], 
     "Item":[{ 
     "Description":[{"TextContent":"Cotter pin, MIL-SPEC"}] 
     }] 
     }] 
     }]}</xsl:param> 

    <xsl:param name="prefix2" as="xs:string" select="'cbc'"/> 
    <xsl:param name="prefix1" as="xs:string" select="'cac'"/> 

    <xsl:output indent="yes"/> 

    <xsl:template name="xsl:initial-template"> 
     <xsl:apply-templates select="json-to-xml($json-input)//fn:array[@key = 'Invoice']"/> 
    </xsl:template> 

    <xsl:template match="fn:array[@key = 'Invoice']" priority="5"> 
     <xsl:variable name="ns" select="../fn:string[@key = '_D']"/> 
     <xsl:variable name="ns1" select="../fn:string[@key = '_S']"/> 
     <xsl:variable name="ns2" select="../fn:string[@key = '_B']"/> 
     <xsl:element name="{@key}" namespace="{$ns}"> 
      <xsl:namespace name="{$prefix1}" select="$ns1"/> 
      <xsl:namespace name="{$prefix2}" select="$ns2"/> 
      <xsl:apply-templates> 
       <xsl:with-param name="ns1" select="$ns1" tunnel="yes"/> 
       <xsl:with-param name="ns2" select="$ns2" tunnel="yes"/> 
      </xsl:apply-templates> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="fn:array[@key and *[1][self::fn:map[fn:string]] and not(*[2])]"> 
     <xsl:param name="ns2" tunnel="yes"/> 
     <xsl:element name="{$prefix2}:{@key}" namespace="{$ns2}"> 
      <xsl:value-of select="fn:map/fn:string"/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="fn:array[@key and fn:map[fn:array]]"> 
     <xsl:param name="ns1" tunnel="yes"/> 
     <xsl:element name="{$prefix1}:{@key}" namespace="{$ns1}"> 
      <xsl:apply-templates/> 
     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

C'est l'exemple que je cherchais, il est clair et bien utile ont encore à mettre les attributs dans le fichier XML: 100,00. Merci Martin Honnen. –

+1

@Frankhuaylinosvelasquez, vous devriez être en mesure d'étendre la feuille de style en ajoutant un modèle de vérification pour le contenu particulier de par exemple. ' 100.00 CAD' et ensuite l'afficher avec l'attribut. –

+0

Je vais l'essayer @MartinHonnen, merci encore. –

0

JSON XML Exemple:

JSON: "

"{\n" +" \"color\": \"red\",\n" +" \"value\": \"#f00\"\n" +"}"; 

XSLT:

<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:param name="jsonText"></xsl:param> 
<xsl:mode on-no-match="shallow-copy"/> 
<xsl:template name="init"> 
    <xsl:apply-templates select="json-to-xml($jsonText)"/> 
</xsl:template> 
<xsl:template match="string[@key = 'subjects']" xpath-default namespace="http://www.w3.org/2005/xpath-functions"><xsl:copy> 
<xsl:copy-of select="@*"/> 
<xsl:sequence select="parse-xml(.)/node()"/></xsl:copy></xsl:template</xsl:stylesheet>`