Клуб API Карт

Удаление строк в XML

Пост в архиве.
Lestat-riw
7 октября 2010, 15:43

Есть xml код(ниже приведен).

Как сделать так, чтобы при пустом значении 

<phone></phone>

Удалялась вся строка                    

<p style="margin:3px;"><span style="font-weight:bold">Телефон:</span> <span>$[metaDataProperty.AnyMetaData.phone]</span></p>

Помогите, кто разбирается.Заранее большое спасибо...

 <?xml version="1.0" encoding="utf-8"?>
<ymaps:ymaps xmlns:ymaps="http://maps.yandex.ru/ymaps/1.x"
       xmlns:repr="http://maps.yandex.ru/representation/1.x"
       xmlns:gml="http://www.opengis.net/gml"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maps.yandex.ru/schemas/ymaps/1.x/ymaps.xsd">
    <repr:Representation>
        <repr:Style gml:id="offices">
            <repr:iconStyle>
                <repr:href>http://seminar.acetp.ru/Maps/pmrds.png</repr:href>
                <repr:size x="25" y="26"/>
                <repr:offset x="0" y="-20"/>
            </repr:iconStyle>
            <repr:balloonContentStyle>
                <repr:template>#balloonTemplate</repr:template>
            </repr:balloonContentStyle>
        </repr:Style>
        <repr:Template gml:id="balloonTemplate">
            <repr:text><![CDATA[
                <div style="font-size:11px; margin-left:10px; color:#454545;zoom:1;">
                    <h1 style="color:#91B200; font-size:24px;margin:8px 0px; font-weight:400";>Обучающий семинар</h1>                   
                    <p style="margin:3px;"><span style="font-weight:bold">Дата проведения: </span>$[metaDataProperty.AnyMetaData.data]</p>
                    <p style="margin:3px;"><span style="font-weight:bold">Место проведения:</span> $[metaDataProperty.AnyMetaData.address]</p>
                    <p style="margin:3px;"><span style="font-weight:bold">Телефон:</span><span>$[metaDataProperty.AnyMetaData.phone]</span></p>
                    <p style="margin:3px;"><span style="font-weight:bold">Подробнее:</span><a href="http://seminar.acetp.ru/seminar.aspx?id=$[metaDataProperty.AnyMetaData.url]"> здесь</a></p>
                </div>]]>
            </repr:text>
        </repr:Template>
    </repr:Representation>
    <ymaps:GeoObjectCollection>
        <ymaps:style>#offices</ymaps:style>
        <gml:featureMembers>
            <ymaps:GeoObject>
                <gml:metaDataProperty>
                    <ymaps:AnyMetaData>
                       <address>Москва, Измайловское шоссе, 71</address>
                       <data>29-30 сентября 2010</data>
                       <phone>123-123-123</phone>
                         <url>149</url>
                    </ymaps:AnyMetaData>
                </gml:metaDataProperty>
                <gml:Point>
                    <gml:pos>37.750398 55.792365</gml:pos>
                </gml:Point>
            </ymaps:GeoObject>
            <ymaps:GeoObject>
                <gml:metaDataProperty>
                    <ymaps:AnyMetaData>
                       <address>Мурманская область, Мурманск, улица капитана Егорова, д. 14</address>
                       <data>4-5 октября 2010 года</data>
                       <phone></phone>
                       <url>149</url>
                    </ymaps:AnyMetaData>
                </gml:metaDataProperty>
                <gml:Point>
                    <gml:pos>33.073239 68.966557</gml:pos>
                </gml:Point>
            </ymaps:GeoObject>
 

3 комментария
Придумал.
Пишется в css стилях новый стиль например
.n {display:none;}

Строка

Телефон: $[metaDataProperty.AnyMetaData.phone]



Меняется следующим образом:

pan style="font-weight:bold">Телефон: $[metaDataProperty.AnyMetaData.phone]



И прописываем на страничку стиль выше написанный.
Получается, что при отсутствии записи в
Подставляется значение n, а n имеет значение Display:none.
Если строка 123 заполнена, то телефон отобразится и там где надо и в классе css, но так как такого класса не, то и ничего страшного не произойдет :)

Спасибо Модератору за оформление!
Интересное решение)

Вы можете завести флаг hasPhone со значением "phone" (если телефон есть). Преимуществом этого подхода будет то, что код будет выглядеть более красиво:

Телефон: 2-34-85


против

Телефон: 2-34-85


Однако, придется заполнять еще одно поле у объекта. Как я понял, что это было нежелательным фактором)

Мое решение данной задачи заключалось бы в следующем: я бы убрал шаблон из YMapsML (оставил там бы только данные), а на стороне javascript после загрузки YMapsML делал бы проверку наличия телефона (и других полей) и формировал бы соответствующий шаблон.
пора, пора эти магии в ядро включить.
Хотя бы в виде каконить простой смены шаблонизатора.

marker.style.templated.invoke=function(data){
  return "компания {%name%}{%phone}".suplant({name:data.name,phone:data.phone?"телефон:{%phone}".suplant(data):''});
писано от руки

вариант 1
вариант 2 - препроцесинг данных, опять же на уровне шаблона. например замена phone на полную шаблоную строку и подстановки в конечный шаблон уже отработаного значения.

осталось придумать третий вариант, который подойдет по критериям как ЯКам, так и юзверям.