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

У меня есть приведенный ниже пример XML-файла

Пример 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>

Я просто хочу взять приведенный ниже фрагмент тегов из вышеуказанного XML-файла на основе статуса PASS (я нея не хочу брать теги <?XML version, <testng-results> и class, которые следует игнорировать).

Ожидаемый результат:

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

Я только что использовалниже XSLT, чтобы получить приведенный выше вывод из образца XML-файла, но он не работает. Он вернул все теги, но я просто хочу, чтобы вышеприведенный вывод не отличался от других.

XSLT:

     <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
            <xsl:output indent="yes" method="xml"/>"
            <xsl:template match="@*|node()">
            <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
            </xsl:copy>  
            </xsl:template>
           <xsl:template match="class"/>
           <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
           <xsl:for-each select="test-method[@status='PASS']">
            <xsl:copy>
           <xsl:apply-templates select="@*|node()" />
            </xsl:copy>
            </xsl:for-each>
            </xsl:copy>
      </xsl:stylesheet>

Также с помощью приведенного ниже Java-кода для запуска XSLT и примера XML-файла

Код:

    String XML = fetchDataFrmXML(".//Test//testng-results_2.xml");
    Transformer t = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader(XSL)));
    t.transform(new StreamSource(new StringReader(XML)), new StreamResult(new File(".//Test//Sample1.xml")));

Это пример полезной нагрузки.Но фактическая полезная нагрузка имела несколько узлов со статусами «PASS» и «Failed».Меня интересует только выбор узла PASS в указанном выше формате вывода.

Любые отведения ....

1 Ответ

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

Результат, который вы показываете, может быть получен довольно просто:

XSLT 1.0

<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:strip-space elements="*"/>

<xsl:template match="/testng-results">
    <xsl:copy-of select="class/test-method[@status='PASS']" />
</xsl:template>

</xsl:stylesheet>

Однако в случае более одногоtest-method с status "PASS" приведет к фрагменту 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:strip-space elements="*"/>

<xsl:template match="/testng-results">
    <root>
        <xsl:copy-of select="class/test-method[@status='PASS']" />
    </root>
</xsl:template>

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