2017-10-01 6 views
0

Merci beaucoup stackoverflow pour vos suggestions et réponses.Besoin d'aide pour aligner la valeur de l'attribut dans rootnode en utilisant xslt

ci-dessous est mon code source

<?xml version="1.0" encoding="UTF-8"?> 
<PurchaseOrderDocument creationDate="2017-09-26T18:37:48.837Z" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
     xmlns:dssuid="urn:autoid:specification:universal:Identifier:xml:schema:1" 
     xmlns:dsscore="urn:autoid:specification:interchange:PMLCore:xml:schema:1"> 
    <PurchaseQuery> 
     <EventDate>20170926</EventDate> 
     <bizLocation> 
      <id>urn:ddd:id:sgln:0315563.00000.0</id> 
     </bizLocation> 
     <Serialization> 
      <BATCH_ID>3091145AB</BATCH_ID> 
      <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
      <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
      <GTIN>04028691544401</GTIN> 
      <Count>8088</Count> 
     </Serialization> 
    </PurchaseQuery> 
</PurchaseOrderDocument> 

Ce xml source a a namespaces indésirables Ma cible réelle devrait ressembler à ceci

<?xml version="1.0" encoding="UTF-8"?> 
<ns0:PurchaseOrderDocument xmlns:ns0="urn:global:mns:PurchaseOrder" 
          creationDate="2017-09-26T18:37:48.837Z"> 
    <PurchaseQuery> 
    <EventDate>20170926</EventDate> 
    <bizLocation> 
     <id>urn:ddd:id:sgln:0315563.00000.0</id> 
    </bizLocation> 
    <Serialization> 
     <BATCH_ID>3091145AB</BATCH_ID> 
     <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
     <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
     <GTIN>04028691544401</GTIN> 
     <Count>8088</Count> 
    </Serialization> 
    </PurchaseQuery> 
</ns0:PurchaseOrderDocument> 

J'ai essayé d'appliquer le XSLT ci-dessous, mais l'attribut est pas l'ordre attendu par la cible

<xsl:stylesheet version="2.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="2.0" encoding="UTF-8" /> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 

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

    <xsl:template match="*" priority="1"> 

     <xsl:element name="{local-name()}" > 
      <xsl:namespace name="ns0" 
          select="'urn:global:mns:PurchaseOrder'"/> 
      <xsl:apply-templates select="@*|node()"/> 

     </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

T il sortie après application XSLT est comme ci-dessous

<?xml version='1.0' encoding='UTF-8' ?> 
<PurchaseOrderDocument xmlns:ns0="urn:global:mns:PurchaseOrder" 
         creationDate="2017-09-26T18:37:48.837Z"> 
    <PurchaseQuery> 
    <EventDate>20170926</EventDate> 
    <bizLocation> 
     <id>urn:ddd:id:sgln:0315563.00000.0</id> 
    </bizLocation> 
    <Serialization> 
     <BATCH_ID>3091145AB</BATCH_ID> 
     <EXPIRATION_DATE>20190504</EXPIRATION_DATE> 
     <PRODUCTION_DATE>20170505</PRODUCTION_DATE> 
     <GTIN>04028691544401</GTIN> 
     <Count>8088</Count> 
    </Serialization> 
    </PurchaseQuery> 
</PurchaseOrderDocument> 

J'ai essayé plusieurs façons d'obtenir attribuer Date de création avant l'espace de nom mais est allé en vain .Je ne suis pas en mesure de comprendre où je suis missing.I ont vu beaucoup de blogs, mais malheureusement, je suis incapable de trouver comment conserver l'attribut (qui est la valeur dynamique) dans le nœud racine pour venir dans la position correcte comme dans la structure cible.Cette logique est un peu important pour moi.S'il vous plaît suggérer ce que je devrais inclure dans le code XSLT pour obtenir la structure cible réelle. Toute aide serait grandement appréciée.

Répondre

1

L'ordre des attributs dans le XML sérialisé (et à cet effet, les déclarations d'espace de noms comptent comme des attributs) est considéré comme sans importance et ne peut pas être contrôlé à l'aide de XSLT. La même chose est vraie pour la plupart des bibliothèques de sérialisation que je connais. Saxon possède une extension (xsl: output/@ saxon: attribute-order) pour contrôler l'ordre des attributs sans espace de noms, mais n'affecte pas les déclarations d'espace de noms par rapport aux attributs.

Je dois demander pourquoi cela compte autant. Si vous lisez le XML à l'aide d'un analyseur conforme, l'ordre dans lequel les attributs apparaissent n'apparaît pas, et si vous lisez le XML sans utiliser d'analyseur conforme, vous commettez une erreur grossière.

And also please help me how I can add prefix ns0: for each target line. 

C'est une toute autre affaire. Mais vous ne devriez pas penser "comment puis-je ajouter un préfixe", vous devriez penser "comment puis-je mettre mes éléments de sortie dans l'espace de noms urn:global:mns:PurchaseOrder". Eh bien, il y a trois façons de créer des éléments de sortie:

  • xsl:copy crée toujours un élément avec le même nom (namespace URI plus le nom local) que l'original, il est donc ne convient pas ici.

  • éléments de résultat littéral créer un élément avec le même nom (namespace URI plus le nom local) comme l'instruction dans la feuille de style

  • xsl:element a deux attributs, le nom et l'espace de noms, qui vous permettent de contrôler les deux parties du nom de l'élément de sortie.

+0

Y at-il un code XSLT pour le cas ci-dessus. S'il vous plaît faites le moi savoir. Toute aide est la bienvenue. – piuser

+0

Ajouter un attribut d'espace de noms à l'instruction xsl: element (défini sur l'URI de l'espace de noms); supprime l'instruction xsl: namespace. –