2009-08-06 6 views
1

J'ai un fichier xml comme:Xml au texte avec le formatage

<Order> 
    <EP> 
    <Name>Generation Date</Name> 
    <Value>2009-08-04+05:30</Value> 
    </EP> 
    <EP> 
    <Name>NoOfRecords</Name> 
    <Value>100</Value> 
    </EP> 
<OrderLineItems> 
    <OrderLineItem OrderDateTime="2007-01-01T17:09:04.593+05:30> 
    <Customer> 
     <FullName>Mrs S </FulName> 
    <Address> 
    <AddressLine1>ABC</AddressLine1> 
    <AddressLine2>XYZ</AddressLine2> 
    </Address> 
    </Customer> 
    <EP> 
     <Name>DealerAccount</Name> 
     <Value>00000000000</Value> 
    </EP> 
</OrderLineItem> 
</OrderLineItems> 
</Order> 

Lorsque la balise OrderLineItem répète. Maintenant, je veux convertir ce fichier XML en un fichier texte en utilisant xslt. Le format de fichier plat est fixe et il est comme suit:

00000000000010107  Mrs S  ABC XYZ 
00000000000150709  Mr x  PQR TWR 

où la première colonne contient le Dealeraccount et OrderDate (temps enlevé) second champ est le nom de domaine et des troisième et quatrième sont addressline 1 et AddressLine2 respectivement. S'il vous plaît noter que le formatage du fichier texte est obligatoire et j'ai aussi la longueur de chaque champ, comme la longueur du nom est varchar2 (50) et ainsi de suite.

+0

S'il vous plaît inclure les détails de ce que vous avez essayé Jusqu'à présent, toutes vos questions semblent jusqu'à présent vous demander de faire votre travail pour vous. Vous obtiendrez une bien meilleure réponse de StackOverflow si vous montrez que vous avez fait un effort. –

+1

En outre, cela ressemble beaucoup à votre question précédente: http://stackoverflow.com/questions/1240712/xml-to-text-with-formatting –

+1

raisonnement circulaire? – Jimmy

Répondre

1

Eh bien enfin j'ai obtenu it..here est la solution

<xsl:template name="ColumnSeparator"> 
     <xsl:param name="count" select="1"/> 
     <xsl:param name="separator" select="' '"/> 
     <xsl:if test="$count > 0"> 
      <xsl:value-of select="$separator"/> 
      <xsl:call-template name="ColumnSeparator"> 
       <xsl:with-param name="count" select="$count - 1"/> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template> 

Et puis il suffit d'appeler ce modèle à l'aide:

<xsl:call-template name="ColumnSeparator"> 
       <xsl:with-param name="count" select="50-string-length(Customer/FullName)"/> 
      </xsl:call-template> 
0

Quelque chose comme cela devrait fonctionner - pour la mise en forme exacte, vous devez modifier les <xsl:text> parties - ajouter d'autres espaces ou d'autres délimiteurs:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"> 

    <xsl:output method="text" indent="no"/> 

    <xsl:template match="Order"> 
    <xsl:apply-templates select="OrderLineItems/OrderLineItem" /> 
    </xsl:template> 

    <xsl:template match="OrderLineItem"> 
    <xsl:value-of select="EP/Value"/> 
    <xsl:text>    </xsl:text> 
    <xsl:value-of select="Customer/FullName"/> 
    <xsl:text>  </xsl:text> 
    <xsl:value-of select="Customer/Address/AddressLine1"/> 
    <xsl:text>  </xsl:text> 
    <xsl:value-of select="Customer/Address/AddressLine2"/> 
    <xsl:text> 
    </xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

Vous ne pouvez pas faire beaucoup plus en termes de mise en forme sortie de texte brut dans XSLT - c'est vraiment très limité de cette façon, malheureusement.

Marc

+0

Pour résoudre le problème de l'OP, les valeurs doivent être remplies à une longueur fixe (différente mais constante pour chaque colonne). Exemple de fonction: http://www.xsltfunctions.com/xsl/functx_pad-string-to-length.html –

+0

Bon conseil, merci - mais encore une fois - c'est un add-on XSLT, il n'est pas disponible dans XSLT straight-up lui-même. –

+0

Oups, je n'avais pas regardé de près ce lien. Mais googler "xslt pad string" semble donner beaucoup d'exemples en XSLT standard. –