Una selección dentro de una fileliste de xml
Pregunta
Puedo usar xslt 2.0 para transformar datos xml para los archivos xml.He creado xsl para encontrar todos los archivos en una carpeta, la cual ha funcionado muy bien:
filenames.xml
<?xml version="1.0" encoding="UTF-8"?>
<filelist>
<file>birds2014.xml</file>
<file>birds2013.xml</file>
</filelist>
A continuación, he creado un xsl para buscar dentro de los archivos xml para seleccionar todos los nombres de las aves que se encuentran en la etiqueta <spbird>
en todos los documentos.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:apply-templates/>
<xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>
<xsl:element name="birdname">
<xsl:for-each select="document($files)">
<xsl:value-of select="//spbird">
</xsl:value-of>
</xsl:for-each>
</xsl:element>
</xsl:template>
Resultado:
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
<birdname>Papagei Wellensittich Pfau</birdname>
Espera:
<birdname>Papagei</birdname>
<birdname>Wellensittich</birdname>
<birdname>Pfau</birdname>
Alguien puede ayudar?
Editar He cambiado el
<xsl:template match="*">
a
<xsl:template match="/">
que resuelve el problema de el mismo resultado que muestra hasta 9 veces (en el que hizo este número de vino).
Ahora, con su ayuda, el resultado es:
<birdname>Papagei Wellensittich</birdname>
<birdname>Pfau</birdname>
Pfau
es el pájaro en el segundo archivo xml.El único problema es, que en el documento() parece hacer un para-cada uno en su propio.No tengo pues todas las aves se enumeran por separado en un birdname etiqueta..
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:apply-templates/>
<xsl:variable name="files" select="document('filelist.xml')/filelist/file"/>
<xsl:for-each select="document($files)">
<birdname>
<xsl:value-of select="//spbird">
</birdname>
</xsl:value-of>
</xsl:for-each>
</xsl:element>
</xsl:template>
Solución
Trate de poner su elemento dentro de la xsl:for-each
...
<xsl:for-each select="document($files)">
<birdname>
<xsl:value-of select="//spbird"/>
</birdname>
</xsl:for-each>
Nota:A menos que usted está tratando de construir dinámicamente el nombre del elemento, no hay ninguna razón para utilizar xsl:element
.
Editar
En XSLT 2.0, xsl:value-of
le dará a cada valor de spbird
.En lugar de una xsl:for-each
en el documento, se debe hacer el para-cada uno en el spbird
.Trate de cambiar su xsl:for-each
para el ejemplo de abajo.Si eso no funciona, por favor, agregue un ejemplo de las aves archivos a tu pregunta.
<xsl:for-each select="document($files)//spbird">
<birdname>
<xsl:value-of select="."/>
</birdname>
</xsl:for-each>