我有一个xslt用于从XML文件生成html - 工作正常。有一次我需要从另一个XML文件中添加一些额外的信息。这两个xml文件共享一个文件名(另一个元素中的一个元素属性,文件扩展名为1),这就是我想在第二个xml文档中找到与主xml文档对应的信息。
文档看起来像这样(删除了一些元素):
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&Itemid=314&func=fileinfo&id=3036</downloadurl>
</downloadurls>
</scenario>
<scenario author="information unavailable" filename="Palma di Montechiaro - AI.btt" stock="y"/>
</scenarios>
在模板中,我正在迭代Scenario_List中的所有Scenario元素。变量$ 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 \ Scenarios \ Scenario_Listing.xml -xsl:scenario_campaign_listing.xsl -o:html \ FortressItaly \ Scenarios \ index.html gameName =“Fortress Italy”game = FortressItaly extrainfopath = FortressItaly / Scenarios
我在条目中看到了这个输出:
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 ||
当我根据硬编码字符串查找时,我无法弄清楚为什么 select =“$ extraInfo / scenarios / scenario [ @ filename = concat('Palma di Montechiaro - AI','。btt')] / @ filename”我得到了预期的结果,但是当我查找使用元素的值 select =“$ extraInfo / scenarios / scenario [ @ filename = concat(filename,'。btt')] / @ filename”即使表达式产生相同的文件名字符串,我也什么也得不到。
任何帮助或指导都将不胜感激。
答案 0 :(得分: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')]"/>