Задать вопрос
  • Как вывести itemprop="position" content="" в XSLT?

    @Roman-Fov
    Что выводит? Можно кусок получившегося html?
  • Как правильно написать условие XSLT?

    @Roman-Fov
    1. Задавая вопрос о xslt необходим не только сам файл с трансформациями, но и сам xml (который через них проходит). Это позволяет понять структуру документа и возможные ошибки в xpath.
    2. Тк шаблон напоминает шаблоны из юми, дальнейший код основывается на этом предположении.

    Есть кусок xml из демосайта umi:
    <result xmlns:xlink="http://www.w3.org/TR/xlink" module="catalog" method="object" domain="merrick4185.demo.umi-cms.ru" domain-id="1" system-build="86461" lang="ru" lang-id="1" header="SAUDA DOWN JKT" title="SAUDA DOWN JKT" csrf="3142cd4603afc75134699152ef769789" template-id="1" demo="1" pageId="97" is-default="" request-uri="/shop/muzhskaya_odezda/verhnyaya-odezhda/puhoviki/sauda-down-jkt.xml">
    	<meta>
    	<keywords/>
    	<description/>
    	</meta>
    	<user id="2" status="auth" login="demo" xlink:href="uobject://2" type="sv"/>
    	<page id="97" parentId="285" link="/shop/muzhskaya_odezda/verhnyaya-odezhda/puhoviki/sauda-down-jkt/" object-id="1058" type-id="154" alt-name="sauda-down-jkt" update-time="1542294206" xlink:href="upage://97" is-active="1">
    		<name>SAUDA DOWN JKT</name>
    		<basetype id="52" module="catalog" method="object">
    			<![CDATA[ Объекты каталога ]]>
    		</basetype>
    		<properties>
    			<group id="372" name="rate_voters">
    				<title>Количество проголосовавших</title>
    				<property id="15" object-id="1058" name="rate_voters" type="int" is-important="0">
    					<title>Количество проголосовавших</title>
    					<value>
    						<![CDATA[ 43 ]]>
    					</value>
    				</property>
    				<property id="16" object-id="1058" name="rate_sum" type="int" is-important="0">
    					<title>Сумма баллов</title>
    					<value>
    						<![CDATA[ df ]]>
    					</value>
    				</property>
    			</group>
    		</properties>
    	</page>
    </result>


    И шаблон под него:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <xsl:apply-templates select="//property"/>
      </xsl:template>
    
      <xsl:template match="property"/>
    
      <xsl:template match="property[@name='rate_sum' and normalize-space(value) = '']"/>
    
      <xsl:template match="property[@name='rate_sum' and normalize-space(value) != '']">
        <div>
          <xsl:text>Бренд: </xsl:text>
          <xsl:apply-templates select="value"/>
        </div>
      </xsl:template>
    </xsl:stylesheet>


    Тут мы заставляем обработать все свойства:
    <xsl:apply-templates select="//property"/>

    Далее идут три template:
    <xsl:template match="property"/>
    <xsl:template match="property[@name='rate_sum' and normalize-space(value) = '']"/>
    <xsl:template match="property[@name='rate_sum' and normalize-space(value) != '']">


    Это очень похоже на то, как работают селекторы в css (я про каскад и без наследования). Очень удобно будет разбираться если вы уже сталкивались с css.

    • Первым делом мы отрубаем показ для всех свойств. Просто не будут мешаться.
    • Далее задаём поведение для свойства с пустым значением. Те отсутствие поведения.
    • И под конец задаём поведение при заполненном свойстве.


    Хоть property[@name='rate_sum'] и совпадает с template match="property", оно к нему применяться не будет тк есть более специфичное template match="property[@name='rate_sum' and normalize-space(value) != '']. Оно и будет применено.
    При пустом свойстве будет применятся template match="property[@name='rate_sum' and normalize-space(value) = ''] тк оно более специфичное и проходит по условию.

    3. Задавая шаблон для property[@name='artikul'] необязательно в нём указывать полный xpath к значению этого свойства. Достаточно будет писать с учётом, что мы уже находимся в этом элементе.
    <xsl:apply-templates select="$page//property[@name = 'artikul'][value]"/>

    Тут наверное имелось это ввиду
    <xsl:apply-templates select="$page//property[@name = 'artikul']/value"/>


    Такой код может быть потенциально опасен тем, что в xml документе может быть несколько элементов property c аттрибутом name равным artikul. Обработаются несколько сразу.

    4. Всё в квадратных скобках это условия.
    В xpath $page//property[@name = 'artikul'][value]
    Мы ищем property, где @name = 'articul' вернёт true и значение value вернёт true. При этом на дальнейшую обработку отправится не само значение из value, а property целиком. Ставим слеш и продвигаемся вглубь элемента:
    $page//property[@name = 'artikul']/value
    Мы ищем property, где @name = 'articul' вернёт true и отправляем его значение на дальнейшую обработку.

    5. Можно не заморачиваться и написать с использованием условий. Они достаточно многословны и создают дополнительные сложности в xslt, но порой без них не обойтись. Можно изменить пример выше вот так:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="/">
        <xsl:apply-templates select="//property"/>
      </xsl:template>
    
      <xsl:template match="property"/>
      <xsl:template match="property[@name='rate_sum']">
        <xsl:if test="normalize-space(value) != ''">
          <div>
            <xsl:text>Бренд: </xsl:text>
            <xsl:apply-templates select="value"/>
          </div>
        </xsl:if>
      </xsl:template>
    </xsl:stylesheet>


    6. Тк файл тут не выкладывался, отправил запатченный обратно отправителю.
  • Как правильно написать условие XSLT?

    @Roman-Fov
    хоть часть xml с property скиньте
  • Как разбить строку на символы?

    @Roman-Fov
    Если не секрет, зачем нужно выводить имена в таком странном формате?
  • Как найти td по тексту и получить следующие?

    @Roman-Fov
    Только он может вернуть несколько узлов. Если нужно именно первый то какт так:
    /tr/td[contains(., '1234')]/following-sibling::td[1]/normalize-space(text())
  • Как вывести свойство в UMI шаблонизатор xslt?

    @Roman-Fov
    <meta name="description" content="Купить {result/@title}, от {.//property[@name='proizvoditel']/value/item/@name} в интернет-магазине. При заказе на сумму 2499₽ Подарок!" />

    или вот так правильнее наверн:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="/">
    		<meta name="description">
    			<xsl:attribute name="content">
    				<xsl:text>Купить </xsl:text>
    				<xsl:value-of select="result/@title"/>
    				<xsl:text>, от </xsl:text>
    				<xsl:apply-templates select=".//property[@name='proizvoditel']/value/item/@name"/>
    				<xsl:text> в интернет-магазине. При заказе на сумму 2499₽ Подарок!</xsl:text>
    			</xsl:attribute>
    		</meta>
    	</xsl:template>
    
    	<xsl:template match="property[@name='proizvoditel']/value/item/@name">
    		<xsl:value-of select="."/>
    		<xsl:if test="position() != last()">
    			<xsl:text>, </xsl:text>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
  • Как вывести свойство в UMI шаблонизатор xslt?

    @Roman-Fov
    Там к url страницы надо добавить .xml
  • Как вывести свойство в UMI шаблонизатор xslt?

    @Roman-Fov
    да. Это важно. Тогда нужно добавить туда ещё и значение списка.
    Xml можно посмотреть? И ещё строка какая должна получиться?
  • Как исключить класс из xpath-запроса в C#?

    @Roman-Fov
    Применительно к тем запросам, что есть у вас это будет выглядеть примерно так:
    <div>
        <div class="reader-text font-size-medium">
            <elem attr="a">a</elem>
            <elem attr="b">b</elem>
            <div class="reader-pagination">
                <a class="pull-left chapter-btn" id="link-left" href="/read...">Пред. часть</a>
                <div class="clearfix"></div>
            </div>
            <elem attr="c">c</elem>
        </div>
    </div>


    Xpath:
    //div[@class='reader-text font-size-medium']/*[not(@class = 'reader-pagination')]


    Result:
    <elem attr="a">a</elem>
    <elem attr="b">b</elem>
    <elem attr="c">c</elem>
  • Как с помощью xpath спарсить элемент?

    @Roman-Fov
    Сложно сказать без урла, что там у вас происходит. Ссылку в студию!
  • Как включить LOAD DATA LOCAL INFILE?

    @Roman-Fov Автор вопроса
    Да. Вы были правы. Оказывается права на файлы не попадают под all и включаются отдельно. Спасибо)
  • Как включить LOAD DATA LOCAL INFILE?

    @Roman-Fov Автор вопроса
    разрешение на доступ к файлам есть. не то к сожалению.....
  • Генерирование инфосистем/материалов в hostCMS?

    @Roman-Fov
    да. Или так:
    $oInformationsystemItem->name('Namenamename');
  • Генерирование инфосистем/материалов в hostCMS?

    @Roman-Fov
    $oInformationsystemItem = Core_Entity::factory('Informationsystem_Item');
    $oInformationsystemItem->name = 'Namenamename';
    $oInformationsystemItem->save();

    Оно создаст элемент. Там правда ещё ид системы нужно.