Tengo el siguiente código XMLgrupo de múltiples atributos de XML con XSLT
<smses>
<sms address="87654321" type="1" body="Some text" readable_date="3/09/2011 2:16:52 PM" contact_name="Person1" />
<sms address="87654321" type="2" body="Some text" readable_date="3/09/2011 2:36:41 PM" contact_name="Person1" />
<sms address="87654321" type="1" body="Some text" readable_date="3/09/2011 2:16:52 PM" contact_name="Person1" />
<sms address="123" type="2" body="Some text" readable_date="3/09/2011 10:56:24 AM" contact_name="Person2" />
<sms address="123" type="1" body="Some text" readable_date="3/09/2011 10:57:52 AM" contact_name="Person2" />
<sms address="123" type="2" body="Some text" readable_date="3/09/2011 10:56:24 AM" contact_name="Person2" />
<sms address="12345678" type="1" body="Some text" readable_date="3/09/2011 11:21:16 AM" contact_name="Person3" />
<sms address="12345678" type="2" body="Some text" readable_date="3/09/2011 11:37:21 AM" contact_name="Person3" />
<sms address="12345" type="2" body="Some text" readable_date="28/01/2011 7:24:50 PM" contact_name="(Unknown)" />
<sms address="233" type="1" body="Some text" readable_date="30/12/2010 1:13:41 PM" contact_name="(Unknown)" />
</smses>
Estoy tratando de obtener una ouput como esto (por ejemplo, XML)
<sms contact_name="person1">
<message type="1">{@body}</message>
<message type="2">{@body}</message>
<message type="1">{@body}</message>
</sms>
<sms contact_name="person2">
<message type="2">{@body}</message>
<message type="1">{@body}</message>
</sms>
<sms contact_name="person3">
<message type="2">{@body}</message>
<message type="1">{@body}</message>
</sms>
<sms contact_name="(Unknown)">
<message type="2">{@body}</message>
<message type="1">{@body}</message>
</sms>
<sms contact_name="(Unknown)">
<message type="2">{@body}</message>
</sms>
por ejemplo, html
<div>
<h1>Person: @contact_name (@address)</h1>
<p>message @type: @body</p>
</div>
he logrado hacer esto con el siguiente código XSLT (disculpen el código de abajo no refleja el html en su totalidad, la salida es el resultado deseado!)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="txt" match="sms" use="@contact_name" />
<xsl:template match="smses">
<xsl:apply-templates select="sms[generate-id(.)=generate-id(key('txt', @contact_name)[1])]">
<xsl:sort select="@address" order="ascending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="sms">
<h4><xsl:value-of select="@contact_name" /></h4>
<xsl:for-each select="key('txt', @contact_name)">
<br />
<xsl:value-of select="@body" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
El problema que tener es, o más bien la pregunta que estoy haciendo. Tengo un elemento sms con un atributo @contact_name
que es "(desconocido)" pero el @address
es único entre ambos elementos, es decir, no se deben agrupar porque el mensaje sms provino de un número/persona diferente (aunque el nombre del contacto) es lo mismo, es irrelevante). Debería intentar reordenar/cambiar los datos XML o si hay alguna forma de que XSLT reconozca el grupo para unknown debe verificar si el @address
es diferente si el @contact_name
es el mismo.
Editar:
no dijera (o más bien olvidado) que, si bien hay algunos mensajes SMS con la misma y única @contact_name
@address
también hay casos en los que algunos de los campos tienen @address
ligera discrepancia en los que no lo hacen tener el código de país en frente del número, por ejemplo
<sms contact_name="jared" address="12345" />
<sms contact_name="jared" address="+64112345" />
Pero que están destinados a ser agrupados debido a que son de la misma persona/número.
Editar:
En mi situación sólo habría discrepancias de tener 3 caracteres (por ejemplo 64) código de país y código de red 2 dígitos (por ejemplo 21). Básicamente, el resultado debería ser, si @contact_name
= mismo y @address
es completamente diferente es decir
<sms contact_name="jared" address="12345" />
<sms contact_name="jared" address="5433467" />
entonces deberían ser elementos separados, ya que son de diferentes personas/número (s).
si @contact_name
= mismo y @address
es diferente únicamente por los códigos de país y de red es decir
<sms contact_name="jared" address="02112345" />
<sms contact_name="jared" address="+642112345" />
entonces deben ser agrupados, ya que son de la misma persona/número
Editar:
códigos de país: +64 (3 caracteres)
códigos de red: 021 (3 caracteres, usua lly el último carácter cambia según la red)
Los números (@address
) se guardan por <sms>
como + 64-21-12345 (sin guiones) o 021-12345 (excluyendo el guión).
Buena pregunta , +1. Ahora podrá aprender y aplicar la agrupación Muenchian utilizando claves compuestas. –
@_Jared: Necesita explicar (mejor editando la pregunta) las reglas para prefijar con el código de país: Isit 2 dígitos solo o tres dígitos, o número de dígitos variable? En caso de que sea este último, entonces la solución debería haber sido proporcionada con una lista de todos los códigos de país posibles. –
@_Dimitre - Disculpas, espero haberlo dejado más claro ahora. Estaba tan cerca de hacer que esto funcionara por mi cuenta hasta que llegue a esta barrera. ¡Agradezco mucho tu ayuda! – Jared