使用XSLT将常规文本文件转换为XML
我有一个文本文件,看起来像这样:
XXX^YYYY^AAAAA^XXXXXX^AAAAAA.... 使用插入符号(^)分隔字段,我的假设是: 第一个字段= NAME 等等.. 我想使用xsl(XSLT)将其转换为有效的XML. <name>XXX</name> <l_name>YYYY</l_name> 我知道可以使用Perl轻松完成,但如果可能的话,我需要使用XSLT.
可以使用标准XSLT 2.0函数
unparsed-text() 读取文本(非XML)文件.
然后可以使用标准的XPath 2.0功能 XSLT 2.0有自己强大的instructions to handle text processing using regular expressions:: 在这个真实示例中,可以看到XSLT文本处理的一些更强大的功能以及这些函数和指令:XSLT solution to the WideFinder problem. 最后,这是一个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> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |