1

I have a set of XML documents that all share the same schema. (They're SAPI grammars with semantic tags, if that matters.) I can use the documents to match text strings, returning a set of attributes with known values.

My problem is that I'd like to take a set of attribute values and generate a string from the grammar that (when submitted to the grammar) would produce the same set of attribute values. A further complication is that different grammars have the tags in different order (the grammars are for different natural languages), so I can't do a straightforward tree walk.

Does anybody have a good approach to this problem?

EDIT: Here's an example set of grammars:

Grammar 1 (English):

<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>

Grammar 2: (German)

<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>

What I want to do is to specify "NumberCommand = 5" and get "choose 5" from the English grammar, and "funf klicken" from the German grammar.

4

2 に答える 2

2

XPathを使用してみましたか?

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

また、説明から実行しようとしていることを正確に解析することも少し困難です。問題のXMLドキュメントのサブセットの例を貼り付けると役立つ場合があります。

編集:

「NUMBER5」エントリ(警告、未テスト)を取得するための潜在的なXPathクエリは次のとおりです。

/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の適切な値を取得する方法はわかりません。ただし、ランダム化する必要がある場合は、すべてを取得してから、コード側からランダムに1つ選択します。

于 2009-11-16T19:52:36.493 に答える
-1

そこで、文法規則を (XML ではなく、解析された形式を使用して) 直接トラバースし、セマンティック タグを含むセットを使用することにしました。セマンティック情報を含むノードに到達したら、適切なセマンティック タグに一致するノードを選択します (そして、一致するものをセットから削除します)。それ以外の場合は、ランダムに遷移します。エンド ノードに到達したら、セットが空であることを確認します。そうでない場合は、エラーです (必要なタグがすべて含まれていない有効な reco を生成しました)。

于 2009-11-20T03:33:13.447 に答える