2016-07-20 33 views
2

我有一個xslt,我正在使用它從一個XML文件生成html - 工作正常。有一點我需要從另一個XML文件中添加一些附加信息。這兩個xml文件共享一個文件名(另一個文件擴展名中的一個元素中的屬性和一個沒有的屬性),這就是我想要如何在與主要xml文檔相對應的第二個xml文檔中查找信息的方式。XPath匹配列表中的元素使用字符串contant但不與另一個元素的值

的文件看起來像這樣(除去少數幾個元素):

Scenario_Listing.xml

<Scenario_Listing> 
    <Scenario_List> 
    <Scenario> 
     <Title> 
     <battle_title>Caltagirone H2H</battle_title> 
     </Title> 
     <filename>Caltagirone H2H</filename> 
     <picture_link>scenpics/Caltagirone H2H.bmp</picture_link> 
     <Map_Size> 
     <map_area>0.727 Sq. km</map_area> 
     <map_width>688 m</map_width> 
     <map_depth>1056 m</map_depth> 
     </Map_Size> 
     <region>Italy</region> 
    </Scenario> 

    <Scenario> 
     <Title> 
     <battle_title>Palma di Montechiaro</battle_title> 
     </Title> 
     <filename>Palma di Montechiaro - AI</filename> 
     <picture_link>scenpics/Palma di Montechiaro - AI.bmp</picture_link> 
     <Map_Size> 
     <map_area>0.067 Sq. km</map_area> 
     <map_width>320 m</map_width> 
     <map_depth>208 m</map_depth> 
     </Map_Size> 
    </Scenario> 

    </Scenario_List> 
</Scenario_Listing> 

二級xml文件看起來是這樣的:

Extra_Info.xml

<scenarios> 
    <scenario author="information unavailable" filename="AD Flak Hunt.btt"> 
     <downloadurls> 
      <downloadurl who="Battle Front">http://www.battlefront.com/index.php?option=com_remository&amp;Itemid=314&amp;func=fileinfo&amp;id=3036</downloadurl> 
     </downloadurls> 
    </scenario> 
    <scenario author="information unavailable" filename="Palma di Montechiaro - AI.btt" stock="y"/> 
</scenarios> 

在模板中,我遍歷Sc中的所有Scenario元素enario_List。變量$ extraInfo包含輔助xml文檔,並加載得更早以用於查找其他信息。從模板的代碼片段看起來是這樣的:

<xsl:for-each select="Scenario_List/Scenario"> 
     <xsl:variable name="scenarioExtraInfo" select="$extraInfo/scenarios/scenario[@filename=concat(filename,'.btt')]"/> 

     <xsl:message>filename element |<xsl:value-of select="filename" />|, concat file extension |<xsl:value-of select="concat(filename, '.btt')" />|</xsl:message> 
     <xsl:message>just picking the first one |<xsl:value-of select="$extraInfo/scenarios/scenario[1]/@filename" />| look up by string |<xsl:value-of select="$extraInfo/scenarios/scenario[@filename=concat('Palma di Montechiaro - AI', '.btt')]/@filename" />| look up using the filename element |<xsl:value-of select="$extraInfo/scenarios/scenario[@filename=concat(filename,'.btt')]/@filename" />|</xsl:message> 

當我處理模板:

saxon9t -s:FortressItaly \方案\ Scenario_Listing.xml -xsl:scenario_campaign_listing.xsl -o:HTML \ FortressItaly \方案\ index.html在gameName = 「山寨意大利」 遊戲= FortressItaly extrainfopath = FortressItaly /場景

我看到這個輸出的條目:

filename element |Palma di Montechiaro - AI|, concat file extension |Palma di Montechiaro - AI.btt| 
just picking the first one |AD Flak Hunt.btt| look up by string |Palma di Montechiaro - AI.btt| look up using the filename element || 

我想不通爲什麼當我仰望基於硬編碼字符串 選擇=「$ extraInfo /場景/場景[@文件名= CONCAT(‘帕爾馬迪蒙泰基亞羅 - AI’,‘.btt’)]/@文件名「我得到了預期的結果,但是當我使用元素 的值查找select =」$ extraInfo/scenarios/scenario [@ filename = concat(filename,'.btt')]/@ filename「即使表達式導致相同的文件名字符串。

任何幫助或指導,將不勝感激。

回答

2

當你使用這個表情......

<xsl:variable name="scenarioExtraInfo"    
       select="$extraInfo/scenarios/scenario[@filename=concat(filename,'.btt')]"/> 

它尋找一個filename元素是在其他文件中scenario元素的子元素。不是在主文件中filename元素當前Scenario節點

試試這個

<xsl:variable name="scenarioExtraInfo" 
       select="$extraInfo/scenarios/scenario[@filename=concat(current()/filename,'.btt')]"/> 

current()將把當前Scenario節點在xsl:for-each聲明。

或者,也許這...

<xsl:variable name="filename" select="filename" /> 
<xsl:variable name="scenarioExtraInfo" 
       select="$extraInfo/scenarios/scenario[@filename=concat($filename,'.btt')]"/> 
+0

謝謝。我知道在看到解決方案之後,這將是簡單/明顯的事情。當然,XPath需要上下文來知道文件名(或任何其他名稱的含義)。 –

相關問題