Conversión de XML a VXML usando XSLT

Soy nuevo en XML y sus lenguajes relacionados. Estoy tratando de hacer un proyecto relacionado con voiceXML. Donde necesito convertir un documento XML a un documento VoiceXML usando XSLT. Traté de convertir el siguiente archivo XML usando xslt. Pero obtengo un resultado como: "Estoy aquí No estoy aquí Estoy aquí No estoy aquí" ¿Pueden ayudarme a resolver esto?

Gracias de antemano.

Archivo XML= "miProyecto.xml"

<?xml version="1.0" encoding="UTF-8" ?>

<?xml-stylesheet type="text/xsl" href="myProj_xsl.xsl"?>


<myProjtag>
<prompt>
    I am here
</prompt>
<prompt>
    I am not here
</prompt>
</myProjtag>

archivo XSLT="miProy_xsl.xsl"

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <vxml version="2.0" lang="en">
        <form id="myProj">
            <prompt>
                <xsl:value-of select="."/>
            </prompt>
            <prompt>
                <xsl:value-of select="."/>
            </prompt>
        </form>
    </vxml>
</xsl:template> 

</xsl:stylesheet>

preguntado el 22 de mayo de 12 a las 17:05

¿Podría incluir su deseado xml de salida? -

2 Respuestas

¿Está tratando de procesar la transformación abriendo el XML en un navegador web?

Si es así, lo que está viendo es que los navegadores intentan representar el resultado una vez que se completa la transformación. Dado que el navegador no tiene idea de cómo mostrar vxml, solo verá nodos de texto.

Lo que ayudaría es que use un procesador XSLT. Yo lo recomiendo Sajón. Saxon-HE sería perfecto para comenzar. La documentación debería permitirle ejecutar fácilmente transformaciones desde la línea de comandos.

Agregué otro ejemplo de XSLT 1.0 que puede usar. La pieza más importante es la plantilla de identidad. Esto copiará todos los nodos (texto/elementos/comentarios/instrucciones de procesamiento) y atributos tal como están sin modificaciones (siempre que no sean anulados por otra plantilla). Simplemente agregue nuevas plantillas si necesita anular la plantilla de identidad.

Además, robé el de Franci Avila. id creación pero usó un AVT en lugar de xsl:attribute. Hice esto solo para mostrar un AVT. Los AVT también son útil para aprender.

Entrada XML (Quité el xml-stylesheet PI de la entrada. Si no lo elimino, tendría que anular la plantilla de identidad para eliminarlo).

<myProjtag>
  <prompt>I am here</prompt>
  <prompt>I am not here</prompt>
</myProjtag>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!--Identity tempate.-->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <vxml version="2.0" lang="en">
      <form id="{substring(local-name(/*), 0, string-length(local-name(/*))-2)}">
        <xsl:apply-templates select="*/*"/>
      </form>
    </vxml>    
  </xsl:template>

</xsl:stylesheet>

Salida XML

<vxml version="2.0" lang="en">
   <form id="myProj">
      <prompt>I am here</prompt>
      <prompt>I am not here</prompt>
   </form>
</vxml>

Si tiene alguna pregunta sobre XSLT, cómo ejecutar Saxon desde la línea de comandos, etc., hágamelo saber.

Respondido 29 Oct 19, 16:10

Debe prestar atención a su nodo de contexto.

<xsl:template match="/"> significa que su nodo de contexto es el documento. El valor de todo el nodo es solo una concatenación de todo el texto del documento. Así repitiendo <xsl:value-of select="."/> Le dará todo el texto en el documento dos veces.

Prueba esto en su lugar:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="node()|@*">
<xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
</xsl:template>


<xsl:template match="/*">
<form>
   <xsl:attribute name="id">
      <xsl:value-of select="substring(local-name(), 0, string-length(local-name())-2)"/>
   </xsl:attribute>
   <!-- * is prompt elements -->
   <xsl:apply-templates select="*"/>
</form>
</xsl:template>


<xsl:template match="/">
    <vxml version="2.0" lang="en">
            <!-- * is myProjTag element -->
            <xsl:apply-templates select="*"/>
    </vxml>
</xsl:template> 
</xsl:stylesheet>

contestado el 22 de mayo de 12 a las 17:05

¿Puede explicarme por qué ha utilizado la siguiente línea de código? - Aps

Entonces tus myProjTag elemento (que supongo que tendrá diferentes nombres) siempre producirá un id="myProj" atributo, sin importar el nombre que use. - Francisco Ávila

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.