使用XSLT将常规文本文件转换为XML

| 我有一个看起来像这样的文本文件:
XXX^YYYY^AAAAA^XXXXXX^AAAAAA....
使用插入符(^)分隔字段,我的假设是: 第一个字段= NAME 第二场=姓 第三个字段=地址 等等.. 我想使用xsl(XSLT)将其转换为有效的XML。 如:
<name>XXX</name>
<l_name>YYYY</l_name>
我知道可以使用Perl轻松完成,但是如果可能的话,我需要使用XSLT来完成。     
已邀请:
可以使用标准XSLT 2.0功能X2ѭ读取文本(非XML)文件。 然后,可以使用标准XPath 2.0函数
tokenize()
和另外两个接受正则表达式作为其参数之一的标准XPath 2.0函数
matches()
replace()
。 XSLT 2.0具有自己强大的指令来使用正则表达式处理文本::6ѭ,
<xsl:matching-substring>
<xsl:non-matching-substring>
指令。 在此实际示例中,可以通过以下功能和说明了解XSLT文本处理的一些更强大的功能:一种针对WideFinder问题的XSLT解决方案。 最后,这是一个XSLT 1.0解决方案:
<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>
当此转换应用于以下XML文档时:
<t>John^Smith^Bellevue^WA^98004</t>
所需的正确结果产生了:
<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>
    
使用XSLT 1.0进行标记和排序 如果您使用xslt 2.0,则更加简单: fn:tokenize(字符串,模式)
Example: tokenize(\"XPath is fun\", \"\\s+\")
Result: (\"XPath\", \"is\", \"fun\")
    

要回复问题请先登录注册