Генерация XML-пути из набора атрибутов - PullRequest
1 голос
/ 16 ноября 2009

У меня есть набор документов 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" из грамматики немецкого языка.

Ответы [ 2 ]

2 голосов
/ 16 ноября 2009

Вы пробовали использовать XPath?

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

Также немного сложно разобрать, что именно вы пытаетесь сделать из описания. Это может помочь, если вы вставили пример подмножества рассматриваемых XML-документов.

EDIT:

Вот потенциальный запрос 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, если только они не должны быть рандомизированы, и в этом случае я бы просто получил их все, а затем выбрал одно случайное со стороны кода.

0 голосов
/ 20 ноября 2009

Итак, что я решил сделать, это пройти через грамматические правила напрямую (используя разобранную форму, а не XML) и использовать набор, содержащий семантические теги. Когда я достигаю узла, содержащего семантическую информацию, я выбираю узел, который соответствует соответствующему семантическому тегу (и удаляю совпадение из набора); в противном случае я делаю переход наугад. Когда я достигаю конечного узла, я проверяю, что набор пуст; если нет, то это ошибка (я сгенерировал действительную копию, которая не имеет всех необходимых тегов).

...