XML, Textdatei Fester Breite mit xsl-style-sheet
Ich brauche Hilfe die Formatierung dieser xml-Code in eine Textdatei fester Breite mit einem xsl-Stylesheet. Ich weiß sehr wenig über xsl und fand sehr wenig Informationen online, wie dies getan werden kann.
Im Prinzip brauche ich diese xml -
<?xml version="1.0" encoding="UTF-8"?>
<Report>
<table1>
<Detail_Collection>
<Detail>
<SSN>*********</SSN>
<DOB>1980/11/11</DOB>
<LastName>user</LastName>
<FirstName>test</FirstName>
<Date>2013/02/26</Date>
<Time>14233325</Time>
<CurrentStreetAddress1>53 MAIN STREET</CurrentStreetAddress1>
<CurrentCity>san diego</CurrentCity>
<CurrentState>CA</CurrentState>
</Detail_Collection>
</table1>
</Report>
In diesem format, alle auf der gleichen Linie
*********19801111user test 201302261423332553 MAIN STREET san diego CA
Diese sind die Feste Breite
FR TO
1 9 SSN
10 17 DOB
18 33 LastName
34 46 FirstName
47 54 Date
55 62 Time
63 90 CurrentStreetAddress1
91 115 CurrentCity
116 131 CurrentStat
Alle Hilfe ist sehr willkommen!
Vielen Dank im Voraus!
Können Sie eine Erweiterung wie node-set(), oder es wird eine zusätzliche xml-Dokument/Datei, halten Sie die Breite und die Reihenfolge der Ausgabe?
InformationsquelleAutor user973671 | 2013-05-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Geheimnis, um dies zu tun, in XSLT 1.0 ist zu erkennen, dass Sie können kombinieren, eine "Polsterung" - Strategie, die mit "substring" - Strategie, die entweder pad oder schneiden Sie ein Stück text auf die gewünschte Breite. Insbesondere XSLT-Anweisungen in dieser form:
...wo
concat
wird verwendet, um eine Reihe von Füllzeichen, um einen string und beisubstring
wird verwendet, um den Grenzwert der gesamten Breite, sind hilfreich. Mit dieser sagte, hier ist ein XSLT 1.0-Lösung, die das leistet, was Sie wollen.Bitte beachten Sie, dass in Ihrem erwarteten Ausgang, einige der Zeichen breiten entsprechen nicht Ihren Anforderungen; zum Beispiel, nach den Vorschriften
<LastName>
sollte so bemessen sein, 16 Zeichen, in der Erwägung, dass Ihre Ausgabe erscheint zum abschneiden am 13. Das heißt, ich glaube, dass meine Lösung unterhalb des outputs, was Sie erwarten.Wenn diese XSLT:
...für die zur Verfügung gestellte XML (mit einem
</Detail>
Hinzugefügt, um das Dokument well-formed):...das erwartete Ergebnis produziert:
gute Frage. Ich habe gerade ein update gemacht, der Platz für das Szenario, das Sie beschreiben.
InformationsquelleAutor ABach
Hier sind (aus meiner Sicht) lite zuverlässigere und pflegbare version:
Es wird das richtige ausgegeben, selbst wenn die Felder in der input nicht in Ordnung mit dem gewünschten Ausgang, oder wenn Felder fehlen in der Eingabe.
Auch Sie der Ansicht, dass es mehr als ein Detail-Eintrag.
Ähm, alle breiten ab: wenn CurrentStreet nimmt den Spalten 63 bis 90, die Breite ist 28, nicht 90 - 63 (= 27). Und ähnlich für alle anderen.
Mit ein wenig näher finden Sie
, $width+1
. 😉 Dachte computer sind besser in der Berechnung als die Menschen.Ah, ich war zu schnell. Touché.
Hi, mir gefällt deine Lösung sehr viel, aber was ist, wenn die Daten, die benötigt werden, um dargestellt werden Linksbündig (Text) oder von rechts justifed (zahlen)
InformationsquelleAutor hr_117
Pad einen string auf eine bestimmte Länge, die in XSLT 1.0, ich würde verwenden eine Kombination von concat() und substring(). In einer Vorlage für Detail, zum Beispiel, ich könnte etwas schreiben, wie
Wenn Sie wissen sehr wenig über XSLT, werden Sie auch brauchen, um zu lernen, wie zu konstruieren, das stylesheet: XSLT verwendet in der Regel template-matching zu fahren Ablaufsteuerung in das stylesheet, das ist oft schwierig für Menschen, die aus imperativen Programmiersprachen, um Ihre Köpfe herum.
Wenn Sie wissen, dass jedes Detail-element werden die gleichen Kinder in der gleichen Reihenfolge (dies ist eine Sache, die DTDs und Schemata sind gut für), dann die einfachste Sache zu tun ist, um eine Vorlage schreiben für jeden element-Typ, die auftreten können, in der Eingabe. Das folgende stylesheet zeigt das Muster für einige, aber nicht alle Elemente:
Wenn Detail variieren kann, um oder in der Bevölkerung, die Veränderung kann normalisiert werden durch den Austausch der Aufruf von xsl:apply-templates in das template für die Detail-mit code wie angezeigt in das erste code-fragment hier. Das code-Stil fühlt sich auch natürlicher an einige prozedurale Programmierer; aus diesem Grund rate ich dir, zu vermeiden es bewusst, während learning XSLT. Wenn Sie erfahren möchten, XSLT gut, es zahlt sich aus, Freunde zu werden mit xsl:apply-templates.
Wenn Sie nicht kümmern, über das erlernen von XSLT -, dann ist mein Rat, hoffe, dass jemand Antworten auf Ihre Abfrage, indem Sie Ihnen eine komplette Lösung für Ihre Aufgabe.
InformationsquelleAutor C. M. Sperberg-McQueen