无法通过JAVA运行XSLT,并且在输出中观察到结果为空

时间:2018-12-08 03:44:19

标签: java xml xslt

我只想从XML文件中获取一个标签,而我正在使用它XSLT。

XSLT:

get.php

Input.XML

  <xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/><xsl:template match="@*|node()">
  <xsl:copy>
  <xsl:apply-templates select="@*|node()" />
  </xsl:copy>
  </xsl:template>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/testng-results">
  <xsl:copy-of select="class/test-method[@status='PASS']"/>
  </xsl:template></xsl:stylesheet>

JAVA代码:

<?xml version="1.0" encoding="UTF-8"?>
   <testng-results skipped="0" failed="0" total="10" passed="10">
    <class name="com.transfermoney.Transfer">
        <test-method status="PASS" name="setParameter" is-config="true" duration-ms="4"
            started-at="2018-08-16T21:43:38Z" finished-at="2018-08-16T21:43:38Z">
            <params>
                <param index="0">
                    <value>                   
                          <![CDATA[org.testng.TestRunner@31c2affc]]>
                    </value>
                </param>
            </params>
            <reporter-output>
            </reporter-output>
        </test-method> <!-- setParameter -->
     </class>
     <class name="com.transfermoney.Transfer">
        <test-method status="FAIL" name="setSettlementFlag" is-config="true" duration-ms="5"
            started-at="2018-08-16T21:44:55Z" finished-at="2018-08-16T21:44:55Z">
            <reporter-output>
                <line>                                                             
                       <![CDATA[runSettlement Value Set :false]]>
                </line>
            </reporter-output>
        </test-method> setSettlementFlag
    </class> 
</testng-results>

预期输出:

public static void main(String[] args) throws Exception {
        String XML = fetchDataFrmXML(".//Test//testng-results_2.xml");
        Transformer t = TransformerFactory.newInstance().newTransformer(new StreamSource(new File(".//Test//Cut.xslt")));
        t.transform(new StreamSource(new StringReader(XML)), new StreamResult(new File(".//Test//Sample1.xml")));
      }

FetchXML:

  <test-method status="PASS" name="setParameter" is-config="true" duration-ms="4" started-at="2018-08-16T21:43:38Z" finished-at="2018-08-16T21:43:38Z">
   <params>
      <param index="0">
         <value>                   
          <![CDATA[runSettlement Value Set :false]]>
         </value>
      </param>
   </params>
   <reporter-output/>
</test-method>

运行JAVA类文件后,我得到了空的sample1.xml文件。但是,如果我使用相同的XSLT脚本,只需通过在线编辑器运行它,它就会产生预期的结果。

我的Java文件中是否存在执行XSLT的问题?请帮助我。

1 个答案:

答案 0 :(得分:1)

您的代码对我有用。我唯一更改的是:

  • 声明fetchDataFromXML()方法中使用的变量
  • 在样式表中的版本“ 1.0”之后添加缺少的空格
  • 更改文件名。

我添加了行

System.err.println(t.getClass().getName());

标识使用的XSLT引擎;输出是

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl

您可能想这样做。

更仔细地查看输出,它会显示状态为“ PASS”的记录,这是代码选择的内容,尽管您说过想要的是状态为“ FAIL”的记录。

关于fetchDataFrmXML()方法的注释:通过这种方式重复进行字符串连接来构建字符串的内容效率非常低。请改用StringBuilder。

(我曾经通过向客户指出这个错误来为自己赚取1万美元的顾问费,结果可能为自己节省了100万美元的硬件成本。)