读取XML文本并使用XSLT将其放入行中

时间:2014-01-08 09:16:30

标签: xml xslt xslt-1.0

我有下面的XML文件。我需要在Type和步骤编号中输出包含“step”的Headline个元素EventHeadline

<?xml version="1.0" encoding="ISO-8859-1"?>

<Testlog>
        <Event Timestamp="27-Dec-2012 04:25:12.247 PM" Type="Script End" Headline="Script end [DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003]" Result="WARNING">
        <Property script_name="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003"/>
        <Property script_id="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003.java"/>
    </Event>


    <Event Timestamp="27-Dec-2012 04:16:33.335 PM" Type="General" Headline="_FRMWK.SystemLibrary.Sys_TmxProcesses logStepBegin: Step: 2.001; Action: ImportACU; Narrative:             Import ACU settings based on &apos;&apos; ; TestName: DseBalanceInquiry_FC_Test_003" Result="INFORMATION">
        <Property script_name="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003"/>
        <Property line_number="64"/>
        <Property script_id="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003.java"/>
    </Event>

 </Testlog>

我的XSLT代码为我提供了包含“step”的标题列表。如果我想在一个单独的行中获取步骤编号,我该如何实现它?

<?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">Title</th>
              <th style="text-align:left">Artist</th>
              <th style="text-align:left">Step</th>
              <th style="text-align:left">Headline</th>
           </tr>

           <xsl:for-each select="Testlog/Event[contains(@Headline, 'Step:')]">
              <tr>
                 <td><xsl:value-of select="@Type"/></td>
                 <td><xsl:value-of select="@Result"/></td>
                 <td><xsl:value-of select="@Step"/></td>
                 <td><xsl:value-of select="@Headline"/></td>
              </tr>
           </xsl:for-each>
        </table>
     </body>
  </html>
 </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

以下样式表可以满足您的需求。这一行:

<xsl:value-of select="substring-before(substring-after(@Headline,'Step: '),';')"/>

使用substring-after和substring-before的组合提取作为步骤编号的Headline属性的一部分。

另外,我已将列标题更改为更有意义的内容。显然,你是从W3Schools带走的。在描述您的意图时请小心:我相信您不希望“单独行中的步骤编号”。您希望步骤编号位于同一行并且意味着“在单独的列中”,对吧?

<强>样式表

<?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>
           </tr>

           <xsl:for-each select="Testlog/Event[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>
              </tr>
           </xsl:for-each>
        </table>
     </body>
  </html>
 </xsl:template>

</xsl:stylesheet>

<强>输出

<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>
     </tr>
     <tr>
        <td>General</td>
        <td>INFORMATION</td>
        <td>2.001</td>
        <td>_FRMWK.SystemLibrary.Sys_TmxProcesses logStepBegin: Step: 2.001; Action: ImportACU; Narrative:             Import ACU settings
           based on '' ; TestName: DseBalanceInquiry_FC_Test_003
        </td>
     </tr>
  </table>
 </body>
</html>