1

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

我的问题是我想获取一组属性值并从语法生成一个字符串(当提交给语法时)将产生相同的一组属性值。更复杂的是,不同的语法具有不同顺序的标签(语法适用于不同的自然语言),所以我不能直接进行树遍历。

有人有解决这个问题的好方法吗?

编辑: 这是一组示例语法:

语法 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”。

4

2 回答 2

2

您是否尝试过使用 XPath?

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

从描述中准确解析您尝试执行的操作也有点困难。如果您粘贴一些相关 XML 文档的示例子集,它可能会有所帮助。

编辑:

这是一个潜在的 XPath 查询,用于获取“NUMBER5”个条目(警告,未经测试):

/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 检索适当的值,除非它们应该是随机的,在这种情况下,我将全部检索它们,然后从代码端随机选择一个。

于 2009-11-16T19:52:36.493 回答
-1

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

于 2009-11-20T03:33:13.447 回答