Группа по нескольким атрибутам из XML с XSLT

У меня есть следующий XML

<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>

пытаясь получить тупуту, как это (например, 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>

, например, HTML

<div>
  <h1>Person: @contact_name (@address)</h1>
  <p>message @type: @body</p>
</div>

Мне удалось сделать это со следующим кодом XSLT (пожалуйста, оправдывайте код ниже, не отражает HTML полностью, вывод является желаемым результатом!)

<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>

проблема, которую у меня есть, или, скорее, вопрос я спрашиваю. У меня есть элемент SMS с атрибутом @Contact_name , который является «(неизвестным)», но @Address уникален между обоими элементами, то есть они не должны быть сгруппированы вместе, потому что SMS Сообщение пришло из другого номера / человека (даже если имя контакта то же самое, его неактуальный). Должен ли я попытаться изменить работу / изменить данные XML или есть ли способ получить xslt распознавать группу для неизвестного, должна быть, @Address отличается, если @contact_name тоже самое.

Редактировать:

Я не удалось упомянуть (или, скорее забыл), что пока есть некоторые SMS-сообщения с то же, что @contact_name и уникальные @Address Есть также случаи, когда некоторые из полей @Address имеют небольшое расхождение, где у них нет кода страны перед числом, например,

<sms contact_name="jared" address="12345" />
<sms contact_name="jared" address="+64112345" />

Но они предназначены для сгруппировки, потому что они являются от одного и того же лица / номера.

Отредактируйте:

В моей ситуации будет неработаны только расхождения наличия 3 символа (например, +64) кода страны, плюс 2-значный сетевой код (например, 21). В основном результат должен быть, если @Contact_name = то же самое и @Address совершенно другой I.E.

 <sms contact_name="jared" address="12345" />
 <sms contact_name="jared" address="5433467" />

Тогда они должны быть отдельные элементы, поскольку они от разных людей / чисел (ы).

Если @contact_name = то же самое и @Address отличается только по странам и сетевым кодам То есть

 <sms contact_name="jared" address="02112345" />
 <sms contact_name="jared" address="+642112345" />

, тогда они должны быть сгруппированы, поскольку они от одного человека / числа

Редактировать:

Коды страны: +64 (3 символа)

Сетевые коды: 021 (3 символа, обычно последних изменений символов В зависимости от сети)

номера ( @Address ) сохраняются на либо как + 64-21-12345 (исключая тире), либо 021-12345 (исключая тире) Отказ

8
задан Jared 14 September 2011 в 23:26
поделиться