У меня есть следующий 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 (исключая тире) Отказ