我只想从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的问题?请帮助我。
答案 0 :(得分:1)
您的代码对我有用。我唯一更改的是:
我添加了行
System.err.println(t.getClass().getName());
标识使用的XSLT引擎;输出是
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl
您可能想这样做。
更仔细地查看输出,它会显示状态为“ PASS”的记录,这是代码选择的内容,尽管您说过想要的是状态为“ FAIL”的记录。
关于fetchDataFrmXML()方法的注释:通过这种方式重复进行字符串连接来构建字符串的内容效率非常低。请改用StringBuilder。
(我曾经通过向客户指出这个错误来为自己赚取1万美元的顾问费,结果可能为自己节省了100万美元的硬件成本。)