XSLT函数“substring-before”/“substring-after”

时间:2014-01-08 12:25:03

标签: xml xslt xpath

我有以下XML代码

<Testlog>   
 <Event Type="General" 
   Headline="Sys_TmxProcesses: Step: 1; Action:" 
   Result="INFORMATION">
  </Event>
 <Event Type="General" 
   Headline="Test_013 testMain: Step 1 Passed" 
   Result="INFORMATION">
  </Event>
<Event Type="General" 
   Headline="logStepBegin: Step: 1.001; Action:" 
   Result="INFORMATION">
  </Event>      
 <Event Type="General" 
   Headline="onErrorExit: Step 4.001 Failed" 
   Result="WARNING">
  </Event>  
 <Event Type="Script End" 
   Headline="Script end [DSE.DseBalanceInquiry_FC_Test_013]" 
   Result="WARNING">
  </Event>

 <Event Type="Script End" 
   Headline="Script end [DSE.DseBalanceInquiry_FC_Test_001]" 
   Result="FAIL">
  </Event>     
</Testlog>  

现在我只想抓住 1.型号 2.Result 3.'Step number'我必须从标题获得 4.Headline 5.'步骤状态',我必须从标题获取,这是在步骤编号之后。

以下xslt给出了Type,Result和Headlines的值。 但我无法得到 (1)步骤编号(仅显示编号) (2)步骤状态(通过/失败应显示不是数字)

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
  <h2>Report</h2>
   <table border="1">
   <tr bgcolor="#9acd32">
    <th style="text-align:left">Type</th>
    <th style="text-align:left">Result</th>
    <th style="text-align:left">Step Number</th>
    <th style="text-align:left">Headline</th>
    <th style="text-align:left">Step Status</th>
  </tr>
  <xsl:for-each select="Testlog/Event[@Result='WARNING' or @Result='FAIL' or contains(@Headline, 'Step ')]">
  <tr>
    <td><xsl:value-of select="@Type"/></td>
    <td><xsl:value-of select="@Result"/></td>
    <td><xsl:value-of select="substring-after(@Headline,'Step ')"/></td>
   <td><xsl:value-of select="@Headline"/></td>
   <td><xsl:value-of select="substring-after(@Headline,'Step ')"/></td>
   </tr>
  </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

我认为你应该在调用后嵌套子字符串来解析步骤编号和状态

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 <html>
 <body>
  <h2>Report</h2>
   <table border="1">
   <tr bgcolor="#9acd32">
    <th style="text-align:left">Type</th>
    <th style="text-align:left">Result</th>
    <th style="text-align:left">Step Number</th>
    <th style="text-align:left">Headline</th>
    <th style="text-align:left">Step Status</th>
  </tr>
  <xsl:for-each select="Testlog/Event[@Result='WARNING' or @Result='FAIL' or contains(@Headline, 'Step ')]">
  <tr>
    <td><xsl:value-of select="@Type"/></td>
    <td><xsl:value-of select="@Result"/></td>
   <td><xsl:value-of select="substring-before(substring-after(@Headline,'Step '),' ')"/></td>
   <td><xsl:value-of select="@Headline"/></td>
   <td><xsl:value-of select="substring-after(substring-after(@Headline,'Step '),' ')"/></td>
   </tr>
  </xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>