es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

XSLT: detectar si el nodo ya ha sido copiado al árbol de resultados

Utilizando xsltproc para limpiar XML de entrada.

Piense en un número de parte que hace referencia a una descripción de una parte desde ubicaciones aleatorias en el documento. Mi XML de entrada está mal diseñado y tiene referencias a números de parte en descripciones de partes por todo el documento sin un patrón real de ubicación. Algunas referencias son texto en elementos, otras en atributos, a veces el atributo cambia de significado dependiendo del contexto. El atributo que contiene el número de parte no tiene un nombre consistente, el nombre utilizado cambia según el valor de otros atributos. Tal vez podría construir una clave seleccionando las docenas de lugares variables que contienen el número de parte, pero sería un desastre. También me preocuparía seleccionar inadvertidamente los elementos incorrectos con patrones complejos.

Entonces mi objetivo es copiar solo las descripciones de las partes referenciadas una vez en el documento de salida (no todas las descripciones están referenciadas). Puedo insertar pruebas en todas las plantillas variables para detectar el número de parte en contexto. La solución muy simple sería simplemente comprobar si ya se ha copiado en el árbol de resultados y no copiarlo de nuevo. ¿Pero no hay forma de hacer un seguimiento de esto?

El Plan B es copiarlo varias veces en el árbol de resultados y luego hacer un segundo procesamiento del documento de salida para eliminar los duplicados.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para limpiar el XML de entrada usando xsltproc, puedes planear copiar las descripciones de las partes referenciadas al documento de salida solo una vez, y para lograr esto, puedes insertar pruebas en todas las plantillas para detectar el número de parte en contexto. Sin embargo, no hay una manera eficiente de rastrear si la descripción de la parte ya ha sido copiada al árbol de resultados. Por lo tanto, una solución alternativa es seguir el Plan B, que consiste en copiar la descripción de la parte varias veces al árbol de resultados y luego realizar un segundo recorrido sobre el documento de salida para eliminar los duplicados. Esto se puede lograr utilizando funciones XSLT como xsl:key, xsl:for-each y xsl:if. Primero, puedes construir una clave seleccionando los lugares variables que contienen el número de parte, y luego iterar sobre cada descripción de parte usando xsl:for-each y verificar si ya está en el árbol de resultados utilizando la función xsl:key. Si aún no está en el árbol de resultados, entonces copiarlo al documento de salida. Finalmente, en el segundo recorrido, puedes usar la función xsl:distinct para eliminar cualquier descripción de parte duplicada.

Comments are closed.