Aquí podría ser tu PUBLICIDAD


Valores enumerados basados ​​en distintos XSLT 2.0

votos
4

Tengo una larga lista de valores en XML con identificadores con nombre. Necesito hacer archivos de salida separados para cada uno de los identificadores distintos agrupados y con un nombre único.

Entonces, por ejemplo, digamos que tengo:

<List>
   <Item group=::this_long_and_complicated_group_name_that_cannot_be_a_filename::>
      Hello World!
   </Item>
   <Item group=::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::>
      Goodbye World!
   </Item>
   <Item group=::this_long_and_complicated_group_name_that_cannot_be_a_filename::>
      This example text should be in the first file
   </Item>
   <Item group=::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::>
      This example text should be in the second file
   </Item>
   <Item group=::this_long_and_complicated_group_name_that_cannot_be_a_filename::>
      Hello World!
   </Item>
</List>

¿Cómo puedo escribir una transformación (XSLT 2.0) para generar estos agrupados en nombres de archivos generados y valorados de forma única? Por ejemplo: asignar el primero @groupa file1.xml y el segundo @groupa file2.xml

Publicado el 12/03/2009 a las 18:38
fuente por usuario Jon W
En otros idiomas...        العربية       

1 respuestas

votos
3

Aquí hay una solución que utiliza algunas de las nuevas características buenas en XSLT 2.0:

Esta transformación :

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
      <!--                                                  --> 
    <xsl:template match="/*">
      <xsl:variable name="vTop" select="."/>
      <!--                                                  --> 
        <xsl:for-each-group select="Item" group-by="@group">
          <xsl:result-document href="file:///C:/Temp/file{position()}.xml">
            <xsl:element name="{name($vTop)}">
              <xsl:copy-of select="current-group()"/>
            </xsl:element>
          </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>
</xsl:stylesheet>

cuando se aplica en el documento Xml proporcionado por OP (corregido para estar bien formado!):

<List>
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::">
         Hello World!
    </Item>
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::">
          Goodbye World!
  </Item>
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::">
          This example text should be in the first file
 </Item>
    <Item group="::this_other_long_and_complicated_group_name_that_cannot_be_a_filename::">
          This example text should be in the second file
 </Item>
    <Item group="::this_long_and_complicated_group_name_that_cannot_be_a_filename::">
          Hello World!
  </Item>
</List>

produce los dos archivos deseados : archivo1.xml y archivo2.xml

Respondida el 12/03/2009 a las 08:07
fuente por usuario Dimitre Novatchev


Aquí podría ser tu PUBLICIDAD