Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular text file to XML using XSLT

Tags:

xml

xslt

I have a text file which looks like that:

XXX^YYYY^AAAAA^XXXXXX^AAAAAA....

Fields are separated using a caret(^), my presumptions are:

the first field = NAME
the second filed = Last name
third field = Address

etc..

I would like to turn it into a valid XML using xsl (XSLT). such as:

<name>XXX</name>
<l_name>YYYY</l_name>

I know It can be done easily with Perl, but I need to do it with XSLT, if possible.

like image 915
snoofkin Avatar asked Apr 15 '11 11:04

snoofkin


People also ask

How create XML from XSLT?

Execute an XSLT transformation from an XML fileOpen an XML document in the XML editor. Associate an XSLT style sheet with the XML document. Add an xml-stylesheet processing instruction to the XML document.

What is text () in XSLT?

Definition and Usage. The <xsl:text> element is used to write literal text to the output. Tip: This element may contain literal text, entity references, and #PCDATA.

Can XSLT transform JSON to XML?

Transform JSON using XSLTOxygen makes it possible to transform JSON documents to XML or HTML through XSLT processing.

What is the difference between XSLT and XSL?

XSLT is designed to be used as part of XSL. In addition to XSLT, XSL includes an XML vocabulary for specifying formatting. XSL specifies the styling of an XML document by using XSLT to describe how the document is transformed into another XML document that uses the formatting vocabulary.


1 Answers

Text (non-XML) files can be read with the standard XSLT 2.0 function unparsed-text().

Then one can use the standard XPath 2.0 function tokenize() and two other standard XPath 2.0 functions that accept regular a expression as one of their arguments -- matches() and replace().

XSLT 2.0 has its own powerful instructions to handle text processing using regular expressions:: the <xsl:analyze-string>, the <xsl:matching-substring> and the <xsl:non-matching-substring> instruction.

See some of the more powerful capabilities of XSLT text processing with these functions and instructions in this real-world example: an XSLT solution to the WideFinder problem.

Finally, here is an XSLT 1.0 solution:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common"
 xmlns:my="my:my" exclude-result-prefixes="ext my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <my:fieldNames>
  <name>FirstName</name>
  <name>LastName</name>
  <name>City</name>
  <name>State</name>
  <name>Zip</name>
 </my:fieldNames>

 <xsl:variable name="vfieldNames" select=
  "document('')/*/my:fieldNames"/>

 <xsl:template match="/">
  <xsl:variable name="vrtfTokens">
   <xsl:apply-templates/>
  </xsl:variable>

  <xsl:variable name="vTokens" select=
       "ext:node-set($vrtfTokens)"/>

  <results>
   <xsl:apply-templates select="$vTokens/*"/>
  </results>
 </xsl:template>

 <xsl:template match="text()" name="tokenize">
  <xsl:param name="pText" select="."/>

     <xsl:if test="string-length($pText)">
       <xsl:variable name="vWord" select=
       "substring-before(concat($pText, '^'),'^')"/>

       <word>
        <xsl:value-of select="$vWord"/>
       </word>

       <xsl:call-template name="tokenize">
        <xsl:with-param name="pText" select=
         "substring-after($pText,'^')"/>
       </xsl:call-template>
     </xsl:if>
 </xsl:template>

 <xsl:template match="word">
  <xsl:variable name="vPos" select="position()"/>

  <field>
      <xsl:element name="{$vfieldNames/*[position()=$vPos]}">
      </xsl:element>
      <value><xsl:value-of select="."/></value>
  </field>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied to the following XML document:

<t>John^Smith^Bellevue^WA^98004</t>

the wanted, correct result is produced:

<results>
   <field>
      <FirstName/>
      <value>John</value>
   </field>
   <field>
      <LastName/>
      <value>Smith</value>
   </field>
   <field>
      <City/>
      <value>Bellevue</value>
   </field>
   <field>
      <State/>
      <value>WA</value>
   </field>
   <field>
      <Zip/>
      <value>98004</value>
   </field>
</results>
like image 173
Dimitre Novatchev Avatar answered Nov 16 '22 02:11

Dimitre Novatchev