我有一个看起来像这样的文本文件:
XXX^YYYY^AAAAA^XXXXXX^AAAAAA....
Run Code Online (Sandbox Code Playgroud)
使用插入符号(^)分隔字段,我的假设是:
第一个字段= NAME
第二
个字段= 姓氏第三个字段=地址
等等..
我想使用xsl(XSLT)将其转换为有效的XML.如:
<name>XXX</name>
<l_name>YYYY</l_name>
Run Code Online (Sandbox Code Playgroud)
我知道可以使用Perl轻松完成,但如果可能的话,我需要使用XSLT.
Dim*_*hev 10
可以使用标准XSLT 2.0函数读取文本(非XML)文件unparsed-text().
然后可以使用标准的XPath 2.0函数tokenize()和另外两个标准的XPath 2.0函数来接受常规表达式作为它们的一个参数 - matches()和replace().
XSLT 2.0有自己强大的指令来处理使用正则表达式的文本处理::<xsl:analyze-string>,the <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>
Run Code Online (Sandbox Code Playgroud)
将此转换应用于以下XML文档时:
<t>John^Smith^Bellevue^WA^98004</t>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17826 次 |
| 最近记录: |