Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过JAVA运行XSLT,并且在输出中观察到空结果_Java_Xml_Xslt - Fatal编程技术网

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

无法通过JAVA运行XSLT,并且在输出中观察到空结果,java,xml,xslt,Java,Xml,Xslt,我只想从XML文件中获取一段标记,我正在使用它XSLT XSLT: <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="

我只想从XML文件中获取一段标记,我正在使用它XSLT

XSLT:

  <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>
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")));
      }
  <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>
  public static String fetchDataFrmXML(String fileLocation) throws Exception 
  {
        file = new File(fileLocation);
        fr = new FileReader(file);
        br = new BufferedReader(fr);
        String temp;
        String result = "";
        while ((temp = br.readLine()) != null) {
            result += temp;
        }

        br.close();
        return result;
  }
预期输出:

  <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>
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")));
      }
  <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>
  public static String fetchDataFrmXML(String fileLocation) throws Exception 
  {
        file = new File(fileLocation);
        fr = new FileReader(file);
        br = new BufferedReader(fr);
        String temp;
        String result = "";
        while ((temp = br.readLine()) != null) {
            result += temp;
        }

        br.close();
        return result;
  }
在运行JAVA类文件之后,我得到了空的sample1.xml文件。但是,如果我只是通过在线编辑器运行同一个XSLT脚本,它将给出预期的结果


我的java文件中是否存在执行XSLT的问题?请在这方面帮助我。

你的代码适合我。我唯一改变的是:

  • 声明fetchDataFromXML()方法中使用的变量
  • 在样式表的version=“1.0”之后添加缺少的空格
  • 更改文件名
我加了一行

System.err.println(t.getClass().getName());
确定所使用的XSLT引擎;输出是

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl
你也可以这样做

更仔细地查看输出,它会显示status=“PASS”的记录,这是代码正在选择的记录,尽管您说过希望使用status=“FAIL”的记录

关于fetchDataFrmXML()方法的一个注意事项:通过这种方式重复串接来构建字符串内容的效率非常低。改用StringBuilder


(我曾经向一位客户指出这一错误,为自己赢得了1万美元的咨询费,而这位客户可能因此节省了100万美元的硬件成本)。

我看不出您向我们展示的东西有什么错。但是您还没有向我们展示方法
fetchDataFrmXML()
;当然,我们看不到你的文件存储中有什么。文件名中的双斜杠-“/”-在我看来很奇怪,但我不知道它们是否错了。CDATA标记不会被复制到输出中,但这是一个单独的问题。我更新了我的帖子。使用该方法
fetchDataFrmXML
将文件读入字符串的原因是什么?如果要使用文件作为XSLT转换的输入源,为什么不直接使用
newstreamsource(新文件(“foo/bar.xml”)
。同样不清楚的是,您的问题通常是设置Java代码以正确运行任何XSLT来读取和写入文件系统,还是您认为该特定XML和XSLT有问题。为什么在文件路径中使用双斜杠,例如
Test//testng-results_2.xml