• Как вытащить только цифры из data-image?

    @Roman-Fov
    Ответ написан
    Комментировать
  • Как динамически добавлять блоки или изменять значения полей при использовании xslt?

    @Roman-Fov
    Раз для теста, то можно однотипные данные писать

    data.xml
    <?xml version="1.0"?>
    <root>
    <foo/>
    </root>


    proc.xsl с рекурсией
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="xml" indent="yes"/>
    
        <xsl:template match="/">
            <operations>
                <xsl:call-template name="operation">
                    <xsl:with-param name="counter" select="5"/>
                </xsl:call-template>
            </operations>
        </xsl:template>
    
        <xsl:template name="operation">
            <xsl:param name="counter" select="1"/>
    
            <operation>
                <name>
                    <xsl:text>Ivan</xsl:text>
                    <xsl:value-of select="$counter"/>
                </name>
                <price>
                    <xsl:value-of select="100 * $counter"/>
                </price>
            </operation>
    
            <xsl:if test="$counter > 0">
                <xsl:call-template name="operation">
                    <xsl:with-param name="counter" select="$counter - 1"/>
                </xsl:call-template>
            </xsl:if>
        </xsl:template>
    </xsl:stylesheet>


    xsltproc proc.xsl data.xml > result.xml
    cat result.xml


    <?xml version="1.0"?>
    <operations>
      <operation>
        <name>Ivan5</name>
        <price>500</price>
      </operation>
      <operation>
        <name>Ivan4</name>
        <price>400</price>
      </operation>
      <operation>
        <name>Ivan3</name>
        <price>300</price>
      </operation>
      <operation>
        <name>Ivan2</name>
        <price>200</price>
      </operation>
      <operation>
        <name>Ivan1</name>
        <price>100</price>
      </operation>
      <operation>
        <name>Ivan0</name>
        <price>0</price>
      </operation>
    </operations>


    или для второй версии на циклах
    proc.xsl
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="xml" indent="yes"/>
    
        <xsl:template match="/">
            <operations>
                <xsl:for-each select="1 to 10">
                    <operation>
                        <name>
                            <xsl:text>Ivan</xsl:text>
                            <xsl:value-of select="position()"/>
                        </name>
                        <price>
                            <xsl:value-of select="100 * position()"/>
                        </price>
                    </operation>
                </xsl:for-each>
            </operations>
        </xsl:template>
    </xsl:stylesheet>


    saxonb-xslt -s:data.xml -xsl:proc.xsl -o:result.xml
    cat result.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <operations>
       <operation>
          <name>Ivan1</name>
          <price>100</price>
       </operation>
       <operation>
          <name>Ivan2</name>
          <price>200</price>
       </operation>
       <operation>
          <name>Ivan3</name>
          <price>300</price>
       </operation>
       <operation>
          <name>Ivan4</name>
          <price>400</price>
       </operation>
       <operation>
          <name>Ivan5</name>
          <price>500</price>
       </operation>
       <operation>
          <name>Ivan6</name>
          <price>600</price>
       </operation>
       <operation>
          <name>Ivan7</name>
          <price>700</price>
       </operation>
       <operation>
          <name>Ivan8</name>
          <price>800</price>
       </operation>
       <operation>
          <name>Ivan9</name>
          <price>900</price>
       </operation>
       <operation>
          <name>Ivan10</name>
          <price>1000</price>
       </operation>
    </operations


    Это оно? Так хотели генерировать их?
    Ответ написан
    1 комментарий
  • Как составить XPath выражение?

    @Roman-Fov
    //*[not(@href) and name(.) != 'a']
    Ответ написан
    Комментировать
  • Как парсить теги по очереди?

    @Roman-Fov
    Тут или указывать точно, что нужно (со всякими грязными трюками):

    XML
    <div>
    	<p>par</p>
    	<strong>strong</strong>
    	<divd>
    		<p>divpar</p>
    	</divd>
    	<blockquote>
    		<p>bqpar <strong>bqparstrong</strong></p>
    	</blockquote>
    </div>

    XPath
    //p[name(ancestor::blockquote[1]) != 'blockquote']|//strong[name(ancestor::blockquote[1]) != 'blockquote']|//blockquote

    Result
    Element='<p>par</p>'
    Element='<strong>strong</strong>'
    Element='<p>divpar</p>'
    Element='<blockquote><p>bqpar <strong>bqparstrong</strong></p></blockquote>'


    или перестать злоупотреблять двойными слешами
    Ответ написан
    Комментировать
  • Как забрать текст с помощью Xpath?

    @Roman-Fov
    Там всё просто. Рассматривайте текст как обычные ноды:

    p/code[normalize-space(preceding-sibling::text()[1]) = 'рездел1:']/text()

    p/strong[normalize-space(preceding-sibling::text()[1]) = 'рездел2:']/text()
    Ответ написан
    2 комментария
  • Как написать рекурсию в XSLT?

    @Roman-Fov
    В какой див? Парсер съел кусок вопроса.
    Что должно получится? Может без рекурсии обойдётся?
    Ответ написан
  • Как правильно вывести свойство в XSLT UMI?

    @Roman-Fov
    Ответил развёрнуто тут
    Как правильно написать условие XSLT?
    Ответ написан
    Комментировать
  • Как правильно написать условие XSLT?

    @Roman-Fov
    Попробуйте так:
    <xsl:templates match="property[@name='artikul']" >
      <div>Артикул: <xsl:apply-templates select="value"/></div>
    </xsl:templates>


    Если не идёт, то xml в студию
    Ответ написан
  • Как вывести itemprop="position" content="" в XSLT?

    @Roman-Fov
    <meta itemprop="position" content="{position() + 1}"/>


    Но это сработает при правильном Xpath
    Ответ написан
  • Как правильно составить XSL шаблон?

    @Roman-Fov
    Вопрос, как мне правильно составить XSL шаблон чтобы я мог пробежаться по всем вложенным группам?


    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output indent="yes" encoding="utf-8" version="1.0"/>
    
    	<xsl:template match="/informationsystem">
    		<xsl:if test="count(informationsystem_group) &gt; 0">
    			<ul>
    				<xsl:apply-templates select="//informationsystem_group"/>
    			</ul>
    		</xsl:if>
    	</xsl:template>
    
    	<xsl:template match="informationsystem_group">
    		<li>
    			<xsl:value-of select="name"/>
    		</li>
    	</xsl:template>
    </xsl:stylesheet>
    Ответ написан
    Комментировать
  • Кто работал с информационными группами в hostcms?

    @Roman-Fov
    XML:
    <informationsystem>
    <informationsystem_group>
    	<name>name1</name>
    	<informationsystem_group>
    		<name>name2</name>
    		<informationsystem_group>
    			<name>name3</name>
    		</informationsystem_group>
    	</informationsystem_group>
    </informationsystem_group>
    <informationsystem_group>
    	<name>name4</name>
    	<informationsystem_group>
    		<name>name5</name>
    	</informationsystem_group>
    	<informationsystem_group>
    		<name>name6</name>
    	</informationsystem_group>
    	<informationsystem_group>
    		<name>name7</name>
    	</informationsystem_group>
    	<informationsystem_group>
    		<name>name8</name>
    	</informationsystem_group>
    </informationsystem_group>
    <informationsystem_group>
    	<name>name9</name>
    	<informationsystem_group>
    		<name>name10</name>
    	</informationsystem_group>
    	<informationsystem_group>
    		<name>name11</name>
    	</informationsystem_group>
    </informationsystem_group>
    </informationsystem>


    XSLt:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output indent="yes" encoding="utf-8" version="1.0"/>
    
    	<xsl:template match="/informationsystem">
    		<xsl:if test="count(informationsystem_group) &gt; 0">
    			<ul>
    				<xsl:apply-templates select="informationsystem_group"/>
    			</ul>
    		</xsl:if>
    	</xsl:template>
    
    	<xsl:template match="informationsystem_group">
    		<li>
    			<xsl:value-of select="name"/>
    		</li>
    		<xsl:if test="count(informationsystem_group) &gt; 0">
    			<li>
    				<ul>
    					<xsl:apply-templates select="informationsystem_group"/>
    				</ul>
    			</li>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>


    Result:
    <ul>
       <li>name1</li>
       <li>
          <ul>
             <li>name2</li>
             <li>
                <ul>
                   <li>name3</li>
                </ul>
             </li>
          </ul>
       </li>
       <li>name4</li>
       <li>
          <ul>
             <li>name5</li>
             <li>name6</li>
             <li>name7</li>
             <li>name8</li>
          </ul>
       </li>
       <li>name9</li>
       <li>
          <ul>
             <li>name10</li>
             <li>name11</li>
          </ul>
       </li>
    </ul>
    Ответ написан
    Комментировать
  • Как удалить атрибут в XSL?

    @Roman-Fov
    Правильнее будет его не добавлять.
    Можно снести его значение напр:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output encoding="utf-8" version="1.0"/>
    	<xsl:template match="/">
                <div data-attr="data-value">
                    <xsl:attribute name="data-attr"/>
                    <p>test</p>
                </div>
            </xsl:template>
    </xsl:stylesheet>

    Result:
    <div data-attr=""><p>test</p></div>

    Но неясно зачем нужен такой изврат. Можно же добавлять атрибут при определённых условиях (вместо его удаления при противоположных условиях)

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output encoding="utf-8" version="1.0"/>
    	<xsl:template match="/">
                <div>
                    <xsl:if test="true()">
                        <xsl:attribute name="data-attr">value</xsl:attribute>
                    </xsl:if>
                    <p>test</p>
                </div>
                <div>
                    <xsl:if test="false()">
                        <xsl:attribute name="data-attr">value</xsl:attribute>
                    </xsl:if>
                    <p>test</p>
                </div>
            </xsl:template>
    </xsl:stylesheet>


    Result:
    <div data-attr="value"><p>test</p></div>
    <div><p>test</p></div>
    Ответ написан
    Комментировать
  • Как вывести дополнительные свойства в XSL в HostCMS 6?

    @Roman-Fov
    Тк images, а не image, то значит это задумывалось как свойство со множественными значениями.
    <xsl:apply-templates select="property_value[tag_name='images']/file"/>
    <xsl:template match="property_value[tag_name='images']/file">
        <xsl:value-of select="."/>
    </xsl:template>


    Для остальных:
    <xsl:value-of select="property_value[tag_name='adress']/value"/>
    <xsl:value-of select="property_value[tag_name='telefon']/value"/>


    +Тут есть основные моменты:
    https://www.hostcms.ru/documentation/modules/prope...
    Ответ написан
    Комментировать
  • Как разбить строку на символы?

    @Roman-Fov
    Если делать просто, то можно запользовать exslt

    XML:
    <ФИО Фамилия="Алексеев" Имя="Алексей" Отчество="Алексеевич"></ФИО>


    XSLt:
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    				xmlns:str="http://exslt.org/strings" extension-element-prefixes="str">
    
    	<xsl:template match="/">
    		<xsl:apply-templates select="ФИО/@Имя"/>
    	</xsl:template>
    
    	<xsl:template match="ФИО/@Имя">
    		<tr>
    			<xsl:for-each select="str:tokenize(string(.), '')">
    				<td>
    					<xsl:value-of select="." />
    				</td>
    			</xsl:for-each>
    		</tr>
    	</xsl:template>
    </xsl:stylesheet>


    Result:
    <tr><td>А</td><td>л</td><td>е</td><td>к</td><td>с</td><td>е</td><td>й</td></tr>
    Ответ написан
  • Как найти td по тексту и получить следующие?

    @Roman-Fov
    Following подойдёт для таких штук

    XML:
    <tr>
      <td class="rborder" align="center">1234</td>
      <td class="rborder" align="center">            
          Клубника
      </td>
    </tr>

    XPath:
    /tr/td[contains(., '1234')]/following-sibling::td/normalize-space(text())

    Result:
    String='Клубника'
    Ответ написан
    2 комментария
  • Как вывести свойство в UMI шаблонизатор xslt?

    @Roman-Fov
    <meta name="description" content="{.//property[@name='proizvoditel']}" />

    Оно?
    Можно ещё через xsl:attribute...
    Ответ написан
  • Существует ли визуальный XPath/CSSPath генератор?

    @Roman-Fov
    https://github.com/trembacz/xpath-finder

    Но предостерегу сразу. У таких штук xpath получается довольно избыточным и при малейших изменениях страницы всё перестаёт работать.
    Вообще такие штуки редко оказываются полезны тк результат их работы часто оказывается бесполезен.
    Редко требуется указать полный xpath до эелемента, обычно задачи формулируются по другому.
    Например: Выбрать кнопку с определённым аттрибутом без учёта уровней её вложенности или если она идёт после другой идентичной кнопки.
    Интерфейс настройки таких подробностей будет или идентичен по сложности изучению xpath или превосходить его.....
    Ответ написан
  • Как исключить класс из xpath-запроса в C#?

    @Roman-Fov
    Сложно ответить на этот вопрос без полного документа и более точного понимания задачи. Выбрать всё кроме определённого элемента можно исключив его в xpath.
    Те изменить принцип обработки документа. Обрабатывать не сам элемент элемент1, а все дочение элементы к элементу1.

    Допустим есть документ:
    <root>
    <elem attr="a">a</elem>
    <elem attr="b">b</elem>
    <elem attr="c">c</elem>
    </root>


    По запросам вижу вы пытаетесь сделать примерно такое (выбрать всё, что есть в элементе):
    /root
    И получите текстом:
    <root>
    <elem attr="a">a</elem>
    <elem attr="b">b</elem>
    <elem attr="c">c</elem>
    </root>

    Но можно выбрать только содержимое + наложив определённые ограничения:
    /root/*[@attr != 'b']
    Результат:
    <elem attr="a">a</elem>
    <elem attr="c">c</elem>

    С этим уже удобнее будет работать
    Ответ написан
  • Как правильно собирать js по БЭМ?

    @Roman-Fov
    Есть же ENB для этих целей. И дока хорошая на офф сайте по сборке
    Ответ написан
  • Как визуально повернуть игральную CSS-карту?

    @Roman-Fov
    Ответ написан
    Комментировать