2009-11-16 78 views
1

我有一组XML文档都共享相同的模式。 (它们是具有语义标签的SAPI语法,如果这很重要。)我可以使用这些文档来匹配文本字符串,返回一组具有已知值的属性。从一组属性生成XML路径

我的问题是,我想采取一组属性值,并从语法中生成一个字符串(提交给语法时)将生成相同的一组属性值。另一个复杂的问题是,不同的语法有不同的顺序标记(语法是针对不同的自然语言),所以我不能做一个简单的树行走。

有没有人有这个问题的好方法?

编辑:这里的设置语法的例子:

语法1(英文):

<GRAMMAR LANGID="409"> 
    <DEFINE> 
    <ID NAME="NUMBERS1THROUGH8_ID" VAL="6503" /> 
    <ID NAME="NUMBERCOMMAND" VAL="-1"/> 
    <ID NAME="NUMBER1" VAL="1"/> 
    <ID NAME="NUMBER2" VAL="2"/> 
    <ID NAME="NUMBER3" VAL="3"/> 
    <ID NAME="NUMBER4" VAL="4"/> 
    <ID NAME="NUMBER5" VAL="5"/> 
    <ID NAME="NUMBER6" VAL="6"/> 
    <ID NAME="NUMBER7" VAL="7"/> 
    <ID NAME="NUMBER8" VAL="8"/> 
    <ID NAME="NUMBER9" VAL="9"/> 
    </DEFINE> 

<RULE NAME="ChooseSynoynms"> 
    <L> 
     <P>choose</P> 
     <P>number</P> 
     <P>select</P> 
     <P>click</P> 
    </L> 
</RULE> 

<RULE NAME="NumberList"> 
    <LN PROPNAME="numberCommand" PROPID="NUMBERCOMMAND"> 
    <PN VAL="NUMBER1">one</PN> 
    <PN VAL="NUMBER2">two</PN> 
    <PN VAL="NUMBER3">three</PN> 
    <PN VAL="NUMBER4">four</PN> 
    <PN VAL="NUMBER5">five</PN> 
    <PN VAL="NUMBER6">six</PN> 
    <PN VAL="NUMBER7">seven</PN> 
    <PN VAL="NUMBER8">eight</PN> 
    <PN VAL="NUMBER9">nine</PN> 
    </LN> 
</RULE> 

<RULE ID="NUMBERS1THROUGH8_ID" TOPLEVEL="INACTIVE"> 
    <O %COMMAND_WEIGHT%><RULEREF NAME="ChooseSynoynms"/></O> 
    <RULEREF NAME="NumberList" /> 
    <O> 
     <P PROPNAME="ExplicitOK" VAL="1">ok</P> 
    </O> 
</RULE> 
</GRAMMAR> 

语法2:(德国)

<GRAMMAR LANGID="409"> 
    <DEFINE> 
    <ID NAME="NUMBERS1THROUGH8_ID" VAL="6503" /> 
    <ID NAME="NUMBERCOMMAND" VAL="-1"/> 
    <ID NAME="NUMBER1" VAL="1"/> 
    <ID NAME="NUMBER2" VAL="2"/> 
    <ID NAME="NUMBER3" VAL="3"/> 
    <ID NAME="NUMBER4" VAL="4"/> 
    <ID NAME="NUMBER5" VAL="5"/> 
    <ID NAME="NUMBER6" VAL="6"/> 
    <ID NAME="NUMBER7" VAL="7"/> 
    <ID NAME="NUMBER8" VAL="8"/> 
    <ID NAME="NUMBER9" VAL="9"/> 
    </DEFINE> 

<RULE NAME="ChooseSynoynms"> 
    <L> 
     <P>wahlen</P> 
     <P>Nummer</P> 
     <P>auswahlen</P> 
     <P>klicken</P> 
    </L> 
</RULE> 

<RULE NAME="NumberList"> 
    <LN PROPNAME="numberCommand" PROPID="NUMBERCOMMAND"> 
    <PN VAL="NUMBER1">eins</PN> 
    <PN VAL="NUMBER2">zwei</PN> 
    <PN VAL="NUMBER3">drei</PN> 
    <PN VAL="NUMBER4">vier</PN> 
    <PN VAL="NUMBER5">funf</PN> 
    <PN VAL="NUMBER6">sechs</PN> 
    <PN VAL="NUMBER7">sieben</PN> 
    <PN VAL="NUMBER8">acht</PN> 
    <PN VAL="NUMBER9">neun</PN> 

    </LN> 
</RULE> 

<RULE ID="NUMBERS1THROUGH8_ID" TOPLEVEL="INACTIVE"> 
     <P><O>auf</O></P> <RULEREF NAME="NumberList"/> 
     <O> 
     <P PROPNAME="ExplicitOK" VAL="1">OK</P> 
     </O> 
     <P><RULEREF NAME="ChooseSynoynms"/></P> 
</RULE> 
</GRAMMAR> 

我想要做什么是指定“NumberCommand = 5”,并从英语语法中获得“选择5”,从德语语法中获得“funf klicken”。

+2

如果在问题中包含一些示例,则更有可能得到回复。 – 2009-11-16 19:50:28

回答

-1

所以我决定要直接遍历语法规则(使用解析的形式,而不是XML),并使用包含语义标签的集合。当我到达包含语义信息的节点时,我选择与适当的语义标签匹配的节点(并从集合中删除匹配);否则,我会随机进行转换。当我到达末端节点时,我验证该集合是空的;如果没有,这是一个错误(我产生了一个有效的记录,没有所有必需的标签)。

2

您是否尝试过使用XPath?

http://en.wikipedia.org/wiki/XPath_1.0
http://w3schools.com/XPath/xpath_syntax.asp

这也是一个有点难以解析你试图从描述该怎么做。如果你粘贴了一些XML文档的示例子集,它可能会有所帮助。

编辑:

这是一个潜在的XPath查询获得 “5号” 的条目(警告,未经测试):

/GRAMMAR/RULE[@NAME='NumberList']/LN[@PROPNAME='numberCommand']/PN[@VAL='NUMBER5'] 

下面是一些例子PHP代码,以真正使用它:

$xml = new SimpleXMLElement($xmlstring); 
$result = $xml->xpath(
    "/GRAMMAR/RULE[@NAME='NumberList']". 
    "/LN[@PROPNAME='numberCommand']/PN[@VAL='NUMBER5']"); 

foreach($result as $xmlelement) 
    echo (string) $xmlelement; 

但是,我不明白如何检索ChooseSynonyms的适当值,除非他们应该是随机的,如果我只是检索它们,然后从代码中随机选择一个。

+0

听起来像使用XSLT的情况,可能会生成XSLT ... – Murph 2009-11-16 20:15:29

+0

除了(据我了解xslt),树必须具有相同的结构;对于有关文件来说并非如此。 (它们生成相同的属性,但通过不同的遍历。) – 2009-11-16 20:25:42