xslt是将文本转换为xml结构的好方法吗?
我试图找到一个更好的解决方案,将纯文本(但每个字段的预定义长度)转换为xml。 例如,输入文本可以是“Testuser new york 10018”,前11个字符表示用户名,接下来的12个字符表示城市,接下来的5个字符表示邮政编码。 所以我需要使用预定义的字段长度从上面的字符串形成一个xml。
我在想两种方法
-
通过在输入文本上使用子字符串函数定义业务实体并填充实体属性,然后将实体序列化为xml
-
预定义xml结构,使用xslt导航到每个节点并使用输入文本上的子字符串函数填充值。
以下语句:(XSLT) "isn't suitable for transforming from structured text to XML. "
和语句"XSLT
must
have XML as the input document"
**都是错误的 。
我在想两种方法
通过在输入文本上使用子字符串函数定义业务实体并填充实体属性,然后将实体序列化为xml
预定义xml结构,使用xslt导航到每个节点并使用输入文本上的子字符串函数填充值。
实际上,使用XSLT很容易实现方法2 :
I. XSLT 1.0 :
当这个转换应用于特殊格式的文本时 (包含在单个顶部元素中以使格式正确 – 正如我们在XSLT 2.0中看到的那样,这种包装不是必需的):
Testuser new_york 10018 usera seattle 98000 userb bellevue 98004 userb redmond 98052
产生了想要的结果 :
Testuser new york 10018 usera seattle 98000 userb bellevue 98004 userb redmond 98052
备注 :
-
这只是演示如何完成任务的演示。 这就是为什么我不处理固定宽度的字段(稍微更容易),但空格分隔值。
-
包含在任何值中的任何空格都作为下划线输入输入(或我们选择的任何字符,我们知道它们永远不会成为任何值的一部分。在输出中,任何下划线都会转换为真实空间。
II。 XSLT 2.0解决方案 :
当这个转换应用于任何XML文档时 (未使用且实际上不需要,如在XSLT 2.0中,没有必要具有源XML文档),并且如果文件C:\temp\delete\delete.txt
是 :
Testuser new_york 10018 usera seattle 98000 userb bellevue 98004 userb redmond 98052
再次产生想要的,正确的结果 :
Testuser new york 10018 usera seattle 98000 userb bellevue 98004 userb redmond 98052
备注 :
-
使用标准XSLT 2.0函数
unparsed-text()
。 -
使用标准XPath 2.0函数
tokenize()
。
最后说明 :
大多数复杂的文本处理都是在XSLT中以工业方式完成的。 FXSL库包含一个通用的LR(1)解析器和一个调整后的YACC,它生成XML格式的表 ,这些表是这个通用运行时LR(1)解析器的输入。
使用此工具,我成功地为JSON和XPath 2.0等复杂语言构建了解析器 。
XSLT 2.0非常适合将结构化文本转换为XML。 您可能会喜欢Stephanie Haupt和Maik Stuehrenberg撰写的2010年论文:
http://www.balisage.net/Proceedings/vol5/html/Haupt01/BalisageVol5-Haupt01.html
或者我自己的2008年论文
http://www.saxonica.com/papers/ideadb-1.1/mhk-paper.xml
用于案例研究。
我通常不会尝试使用XSLT 1.0,但Dimitre的答案显示,它可以在简单的情况下完成。