使用XSLT将文本转换为XML,而不知道“模式”是什么

时间:2013-05-01 14:15:47

标签: xml xslt text

我有一个文本文档,我想使用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

3 个答案:

答案 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编码的解析器,方法是配置选项XSLTparse 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>

显然你会从你的字符串中获取元素名称,但希望你能看到使用的模式。