我有一个文本文件,看起来像这样:
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功能tokenize()
和另外两个standard XPath 2.0 functions that accept regular a expression作为他们的参数之一 – matches()
和replace()
.
XSLT 2.0有自己强大的instructions to handle text processing using regular expressions::<xsl:analyze-string>
,<xsl:matching-substring>
和<xsl:non-matching-substring>
指令.
在这个真实示例中,可以看到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>