我有一个文本文档,我想使用XSLT转换为XML以便于处理。 源文件非常通用,例如:
[{c=1,d=2},{cc=11,dd=22}]%{f=4,g=5,h={i=6,j=[7,8]}}%
我想将其转换为XML文件,例如:
<document>
<header>
<item>
<c>1</c>
<d>2</d>
</item>
<item>
<cc>11</c>
<dd>22</d>
</item>
</header>
<content>
<f>4</f>
<g>5</g>
<h>
<i>6</i>
<j>
<elt>7</elt>
<elt>8</elt>
</j>
</h>
</content>
</document>
因此,实质上,“=”之前的字符串是标记名称,此后的所有内容都是内容(带嵌套),只添加了文档,标题,内容和elt节点。原始文件可能包含每个值,并且所有“}”都在不同的行上,但不保证(我不知道这是否重要)
我找到了一些类似案例的答案,其中文本转换为XML,但是事先知道结果节点名称和嵌套级别。 痛苦的感觉应该有一个相对简单的解决方案,但不幸的是我只知道XSLT是强大而有用的,但不是谁写它...
提前感谢您的帮助, DeColaman
答案 0 :(得分:1)
你基本上是在为一些语法编写解析器。这是可行的,但它有助于确切地知道语法是什么,并且有助于了解如何编写递归下降解析器。从你的示例看,它看起来像一个递归语法,这意味着你不能纯粹使用正则表达式。
您可能想看看Rex,Gunther Rademacher用于在XQuery或(最近)XSLT中生成解析器的工具。它没有很好的记录,但它非常强大。
答案 1 :(得分:1)
正如迈克尔所说,这对REx来说确实是一个很好的练习。该示例显示了与JSON的一些相似之处,但为了演示,我们猜测一个更简单的REx语法:
source ::= item '%' item '%' eof
item ::= '{' ( named-item ( ',' named-item )* )? '}'
| '[' ( item ( ',' item )* )? ']'
| element
named-item ::= name '=' item
<?TOKENS?>
name ::= [a-z]+
element ::= [0-9]+
eof ::= $
将其放在名为source.ebnf
的文件中,并使用REx从中生成XSLT编码的解析器,方法是配置选项XSLT
和parse tree
,或使用命令行{{1 }}
解析器包含一个名为-xslt -tree
的函数,它将输入作为字符串接受,并根据上述语法将其转换为具体的语法树。语法树包含每个非终结或命名标记的元素,以及每个未命名标记的TOKEN元素。
然后必须将语法树转换为目标结构。将生成的解析器从文件p:parse-source
导入下面的XSLT:
source.xslt
在XSLT 2.0处理器上运行上述操作,例如撒克逊人将产生预期的结果。
答案 2 :(得分:0)
在XSLT 2.0中有一个名为unparsed-text()
的函数,它将解析HREF(或文件)并返回一个字符串。
然后,您可以使用一个或多个正则表达式指令或函数(例如tokenize()
或xsl:analyze-string
)将字符串分解为序列并处理这些部分。
可以使用xsl:element
指令在样式表中创建元素,如下所示:
<xsl:variable name="elementName" select="'f'"/>
<xsl:element name="$elementName">
..
</xsl:elelent>
显然你会从你的字符串中获取元素名称,但希望你能看到使用的模式。