2011-01-14 10 views
5

tengo varios archivos XML, en un List<File>. Lo que quiero es transformar los xml en un XML con un XSL:Escribir al final de un xml

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="testsuites"> 
    <xsl:call-template name="summary"/> 
</xsl:template> 

<xsl:template name="summary"> 
      <xsl:variable name="testCount" select="sum(testsuite/@tests)"/> 
     <xsl:variable name="errorCount" select="sum(testsuite/@errors)"/> 
     <xsl:variable name="failureCount" select="sum(testsuite/@failures)"/> 
<xsl:variable name="timeCount" select="sum(testsuite/@time)"/> 
     <xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/> 
      <xsl:attribute name="class"> 
       <xsl:choose> 
        <xsl:when test="$failureCount &gt; 0">Failure</xsl:when> 
        <xsl:when test="$errorCount &gt; 0">Error</xsl:when> 
       </xsl:choose> 
      </xsl:attribute> 
     <Build> 
      <NombreTest><xsl:value-of select="$testCount"/></NombreTest> 
      <Failures><xsl:value-of select="$failureCount"/></Failures> 
      <Erreurs><xsl:value-of select="$errorCount"/></Erreurs> 
     <PercentSucces><xsl:call-template name="display-percent"> 
        <xsl:with-param name="value" select="$successRate"/> 
       </xsl:call-template></PercentSucces> 
      <ExecTime><xsl:call-template name="display-time"> 
        <xsl:with-param name="value" select="$timeCount"/> 
       </xsl:call-template> </ExecTime> 
      </Build> 
     </xsl:template> 

<xsl:template match="failure"> 
    <xsl:call-template name="display-failures"/> 
</xsl:template> 

<xsl:template match="error"> 
    <xsl:call-template name="display-failures"/> 
</xsl:template> 

<xsl:template name="display-time"> 
    <xsl:param name="value"/> 
    <xsl:value-of select="format-number($value,'0.000')"/> 
</xsl:template> 

<xsl:template name="display-percent"> 
    <xsl:param name="value"/> 
    <xsl:value-of select="format-number($value,'0.00%')"/> 
</xsl:template> 

<xsl:template name="display-failures"> 
    <xsl:choose> 
     <xsl:when test="not(@message)">N/A</xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="@message"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Mi problema es que cuando estoy bucle y aplicar la transformación con un TransformerFactory siempre borrar el XML de salida. Quiero editar la salida en su lugar.

Sé que puedo hacerlo en Java con un XML temporal y después de fusionarlo, pero estoy casi seguro de que es posible en XSL?

Gracias por ayudar a

+0

Tu pregunta no está clara. ¿Desea ejecutar su transformación en varios documentos de entrada? ¿O desea acceder a varios documentos de entrada desde una transformación? –

+0

quiero ejecutar la transformación de múltiple (misma estructura, la misma hoja de estilo) xml y poner el resultado en un xml – Theo

+0

Buena pregunta, 1. Vea mi respuesta para una explicación y una solución típica. Además, debe averiguar a partir de la documentación de su procesador XSLT cómo pasar parámetros a la transformación. –

Respuesta

1

que necesita para aprobar todas las direcciones URL de documentos dentro de un único parámetro externo y Por lo general, tendrá una transformación como esta:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pdocNames"> 
    <name>doc1.xml</name> 
    <name>doc2.xml</name> 
    <name>doc3.xml</name> 
</xsl:param> 

    <!-- you can directly use $pdocNames/name 
     if the param is provided externally --> 
<xsl:variable name="vDocNames" select= 
    "document('')/*/xsl:param[]@name='pdocNames']/name"/> 

<xsl:template match="/"> 
    <combinedDocs> 
    <xsl:copy-of select="document($vDocNames)"/> 
    </combinedDocs> 
</xsl:template> 
</xsl:stylesheet> 

Cuando se aplica esta transformación en cualquier documento XML (no se utiliza), realiza las siguientes:

  1. obtiene el name elementos que contienen la proporciona en el parámetro $pdocNames URIs documento. Estos elementos están contenidos en la variable vDocNames.

  2. Crea el elemento superior para el documento de salida (en este caso llamado combinedDocs).

  3. copias de todos los documentos XML, cuyo URI se encuentran en los name elementos contenidos en la variable vDocNames. La función estándar XSLT document() se utiliza aquí.

hacer la nota:

Las direcciones URL de todos querían documentos XML deben ser transmitidos externamente a través de un parámetro para la transformación. Depende del proveedor cómo pasar un parámetro a la transformación. Debe leer la documentación provista para su procesador XSLT en particular.

+0

muchas gracias, realmente está ayudando. Pero sobre el elemento 'nombre', tengo una lista de ruta pero no está en un elemento xlm con. puedo poner en el parámetro algo como esto: [ /Users/admin/Documents/testxml/20101119-2254/20101122-1255/TESTS-TestSuites.xml,/Usuarios/admin/Documentos/testxml/20101119-2254/Pruebas de bancos de pruebas .xml, ...] – Theo

+0

tal vez podría crear el xml listando todos los archivos, parece que es el más simple – Theo

+1

@Theo: Sí, esta es otra solución, especialmente cuando los archivos son estáticamente conocidos. En cuanto a pasar un parámetro que contiene un elemento XML o un fragmento XML, sí, esto debería ser posible. Ciertamente es posible para XslCompiledTransform en .NET –

Cuestiones relacionadas