XPath使用字符串来匹配列表中的元素,但不匹配另一个元素的值

时间:2016-07-20 16:25:43

标签: xml xslt xpath

我有一个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&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>

在模板中,我正在迭代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”即使表达式产生相同的文件名字符串,我也什么也得不到。

任何帮助或指导都将不胜感激。

1 个答案:

答案 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')]"/>