如何使用XSLT转换XML文件

时间:2014-01-07 10:54:01

标签: java html xml xslt

我是编码新手,需要帮助解决使用XSLT的XML文件并以HTML格式提供输出。 我有下面的代码。 我需要脚本名称和类型,其中包含result =“INFORMATION”

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="class.xsl"?>
<TestLog>
 <Event dpIter="0">
  <Event Timestamp="27-Dec-2012 04:16:26.830 PM" Type="Script Start" Headline="Script       start [DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003]" Result="INFORMATION">
    <Property line_number="1"/>
    <Property script_iter_count="0"/>
    <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:26.830 PM" Type="General" Headline="D:\TestAutomation\LogLevels.txt (The system cannot find the file specified.)" Result="INFORMATION">
    <Property script_name="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003"/>
    <Property line_number="35"/>
    <Property script_id="DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003.java"/>
  </Event>
 </Event>
</TestLog>

XSLT代码:

  <?xml version="1.0" encoding="ISO-8859-1"?> 
  <xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform">; 
  <xsl:template match="/">
  <html> 
  <body> 
  <h2></h2> 
  <table border="1">
  <tr> 
  <th>Type</th>
  <th>Result</th> 
 </tr> 
 <xsl:for-each select="TestLog/Event"> 
 <tr> 
  <td><xsl:value-of select="Type"/></td> 
  <td><xsl:value-of select="Result"/></td> 
 </tr> 
 </xsl:for-each> 
   </table> 
  </body> 
  </html> 
  </xsl:template> 
 </xsl:stylesheet>

1 个答案:

答案 0 :(得分:0)

据我了解,如果Event属性等于“INFORMATION”,您希望访问Result个节点。

注意:这会告诉您有关XSLT的一般原则,因为您的问题广泛且不具体。只有在问题更精确的情况下,才能给出更准确的答案。

在XSLT中,您可以在方括号中指定此类限制:

<xsl:template match="Event[parent::Event and @Result='INFORMATION']">

上面的代码行匹配Event元素,如果它们是高级Event元素的子元素,并且它们的@Result是正确的。

这是一个完整的样式表,作为查找特定节点的示例:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="TestLog|Event[parent::Testlog]">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="Event[parent::Event and @Result='INFORMATION']">
  <xsl:text>Type: </xsl:text>
  <xsl:value-of select="@Type"/>
  <xsl:text>&#10;</xsl:text>
  <xsl:text>Script name: </xsl:text>
  <xsl:value-of select="Property/@script_name"/>
  <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="Property"/>

</xsl:stylesheet>

如果应用于您的输入XML,结果就是:

Type: Script Start
Script name: DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003
Type: General
Script name: DSE.DSEBalanceInquiry_FC.DseBalanceInquiry_FC_Test_003

找到所需的Event个节点并输出其Type属性,以及其子元素之一的script_name属性。


编辑(回复您的评论):

以下样式表可以满足您的需求,我修改了几项内容:

  • XSL 的命名空间必须为“http://www.w3.org/1999/XSL/Transform
  • 您正在匹配“/”(文档节点)。因此,您必须浏览树以查找for-each的节点,如下所示:TestLog/Event/Event
  • 您的代码包含分号“;”应该删除
  • 属性必须以“@”(或属性::,就此而言)
  • 为前缀

所有这些让我相信你从来没有尝试过这样做。

完整样式表:

<?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></h2>
     <table border="1">
        <tr>
           <th>Type</th>
           <th>Result</th>
        </tr>
           <xsl:for-each select="TestLog/Event/Event[@Result='INFORMATION']">
              <tr>
                 <td>
                    <xsl:value-of select="@Type"/>
                 </td>
                 <td>
                    <xsl:value-of select="@Result"/>
                 </td>
              </tr>
           </xsl:for-each>
     </table>
   </body>
  </html>
</xsl:template>

</xsl:stylesheet>