2009-11-16 77 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