Невозможно запустить XSLT через JAVA и пустой результат наблюдается в выводе - PullRequest
0 голосов
/ 08 декабря 2018

Я просто хочу получить кусок тега из файла 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>

Ввод.XML

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

Код JAVA:

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>

FetchXML:

  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;
  }

Я получаю пустой файл sample1.xml после запуска файла класса JAVA.Но если тот же XSLT-скрипт, который я только что запустил через онлайн-редактор, дает ожидаемый результат.

Есть ли какие-либо проблемы в моем Java-файле для выполнения XSLT?пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 09 декабря 2018

Ваш код работает на меня.Единственное, что я изменил, было:

  • объявление переменных, используемых в вашем методе fetchDataFromXML ()
  • Добавление пропущенного пробела после version = "1.0" в вашу таблицу стилей
  • Изменение имен файлов.

Я добавил строку

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

, чтобы определить используемый механизм XSLT;вывод был

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

Возможно, вы захотите сделать то же самое.

При более внимательном рассмотрении на выходе отображается запись со статусом = "PASS", то есть кодвыбрав, хотя вы сказали, что хотите иметь тот, который имеет статус = "FAIL".

Примечание о вашем методе fetchDataFrmXML (): невероятно неэффективно создавать содержимое строки путем повторного объединения строк таким образом.Вместо этого используйте StringBuilder.

(однажды я заработал 10 тысяч долларов США на оплату услуг консультанта, указав эту ошибку клиенту, который, вероятно, в результате сэкономил 1 миллион долларов на аппаратных затратах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...