Ответы пользователя по тегу XSL & XSLT
  • XML. Как описать XSL, который будет вычислять факториал числа?

    @Roman-Fov
    Рекурсия???...
    Ответ написан
    Комментировать
  • Как разобрать строку в XSLT по разделителю?

    @Roman-Fov
    XML
    <cart>
    	<dimensions>15.2/44/13.5</dimensions>
    </cart>


    XSLt
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="/cart">
    		<div>
    			<xsl:text>Ширина: </xsl:text>
    			<xsl:value-of select="substring-before(dimensions, '/')"/>
    		</div>
    		<div>
    			<xsl:text>Высота:</xsl:text>
    			<xsl:value-of select="substring-before(substring-after(dimensions, '/'), '/')"/>
    		</div>
    		<div>
    			<xsl:text>Глубина:</xsl:text>
    			<xsl:value-of select="substring-after(substring-after(dimensions, '/'), '/')"/>
    		</div>
    	</xsl:template>
    </xsl:stylesheet>


    Result
    <div>Ширина: 15.2</div>
    <div>Высота:44</div>
    <div>Глубина:13.5</div>


    Оно?
    Ответ написан
    2 комментария
  • Почему в Google Chrome и в Opera не открывается xml-файл с подключённым к нему xsl-стилями?

    @Roman-Fov
    Всё он работает. Только нужно предварительно закрыть все другие окна хрома. Если он работает в фоне, то убить все его процессы. Только тогда запускать его с флагом --allow-file-access-from-files.
    Работает во всех браузерах основанных на Chromium.
    Или создать сервер (денвер или что там сейчас на винде) и обращаться к файлам через http. Тогда этой ошибки возникать не будет вообще без флагов всяких.
    Ответ написан
    3 комментария
  • Как делать xslt-преобразование для длинных xml-файлов?

    @Roman-Fov
    Если отличается структурой элемент, то придётся обрабатывать отдельно.
    Если есть общие черты, то можно вместе. Перечисляйте их в apply-templates select и template match.

    XML
    https://pastebin.com/DeN4rRnY

    XSLt
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:template match="/root/APPLICATION">
        <html>
        <body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
        <h1><xsl:value-of select="root/APPLICATION/@NAME"/> </h1>
          <table border="1">
            <tr>
              <td>ID</td>
              <td>Deleted</td>
              <td>IsLocked</td>
              <td>RetriveTime</td>
              <td>ChangeTime</td>
              <td>AccessTime</td>
              <td>SecureStyleID</td>
              <td>Name</td>
              <td>DBName</td>
              <td>TheComment</td>
            </tr>
            <xsl:apply-templates select="MTZAPP_COL/MTZAPP | OBJECTMODE_COL/OBJECTMODE"/>
          </table>
      </body>
      </html>
      </xsl:template>
    
      <xsl:template match="MTZAPP_COL/MTZAPP | OBJECTMODE_COL/OBJECTMODE">
        <tr>
          <td><xsl:value-of select="@ID"/></td>
          <td><xsl:value-of select="@Deleted"/></td>
          <td><xsl:value-of select="@IsLocked"/></td>
          <td><xsl:value-of select="@RetriveTime"/></td>
          <td><xsl:value-of select="@ChangeTime"/></td>
          <td><xsl:value-of select="@AccessTime"/></td>
          <td><xsl:value-of select="@SecureStyleID"/></td>
          <td><xsl:value-of select="@Name"/></td>
          <td><xsl:value-of select="@DBName"/></td>
          <td><xsl:value-of select="@TheComment"/></td>
        </tr>
      </xsl:template>
    </xsl:stylesheet>


    Result
    https://pastebin.com/PizDCL0M

    PS циклы в XSLt не есть хорошо. Те я хочу сказать, что нужно избегать циклов в пользу apply templates везде, где это возможно. Они усложняют таблицы, делают невозможным повторное использование и вообще противоречит идеологии инструмента
    Ответ написан
    Комментировать
  • Как динамически добавлять блоки или изменять значения полей при использовании 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 комментарий
  • Как написать рекурсию в 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>
    Ответ написан
  • Как вывести свойство в UMI шаблонизатор xslt?

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

    Оно?
    Можно ещё через xsl:attribute...
    Ответ написан
  • Генерирование инфосистем/материалов в hostCMS?

    @Roman-Fov
    Так там всё просто. При отправке формы перехватываете то, что вам нужно в тдс и записывайте куда нужно. И ещё: Не используйте формы hostcms, пишите их руками в шаблонах. Так проще получается и гибче.
    Ответ написан
  • Как заменить амперсанд в шаблоне?

    @Roman-Fov
    что не так делаю?

    Используйте translate. Долой странные функции

    <root>
          <foo>123&amp;456</foo>
    </root>

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="/root/foo">
    		<xsl:value-of select="translate(., '&amp;', ' ')"/>
    	</xsl:template>
    </xsl:stylesheet>

    123 456
    Ответ написан
    Комментировать
  • XSL трансформация -> CSV -> как заменить знак новой строки?

    @Roman-Fov
    Без регулярок примерно так:
    <documentRecipientAddressData>
          <street>Centroallee 1000
    Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...</street>
          <street>Centroallee
    1000
    Einfahrt
    Parkhaus 7 an der
    "Alten Waltz" gegenüber Tryp Hotel ...</street>
          <street>Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...</street>
    </documentRecipientAddressData>


    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="/documentRecipientAddressData/street">
    		<xsl:variable name="street">
    			<xsl:call-template name="replace-line-breaks">
    				<xsl:with-param name="text">
    					<xsl:call-template name="normalize-line-breaks">
    						<xsl:with-param name="text" select="."/>
    					</xsl:call-template>
    				</xsl:with-param>
    			</xsl:call-template>
    		</xsl:variable>
    		<xsl:value-of select="normalize-space($street)"/>
    		<xsl:text>&#xa;</xsl:text>
    		<xsl:variable name="street">
    			<xsl:call-template name="normalize-line-breaks">
    				<xsl:with-param name="text" select="."/>
    			</xsl:call-template>
    		</xsl:variable>
    		<xsl:value-of select="replace($street, '\n', ', ')"/>
    		<xsl:text>&#xa;&#xa;</xsl:text>
    	</xsl:template>
    
    	<xsl:template name="replace-line-breaks">
    		<xsl:param name="text"/>
    
    		<xsl:choose>
    			<xsl:when test="not(contains($text, '&#xa;'))">
    				<xsl:value-of select="$text"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:value-of select="substring-before($text, '&#xa;')"/>
    				<xsl:text>,&#160;</xsl:text>
    				<xsl:call-template name="replace-line-breaks">
    					<xsl:with-param name="text" select="substring-after($text, '&#xa;')"/>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    
    	<xsl:template name="normalize-line-breaks">
    		<xsl:param name="text"/>
    
    		<xsl:choose>
    			<xsl:when test="not(contains($text, '&#xa;&#xa;'))">
    				<xsl:value-of select="$text"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<xsl:variable name="text">
    					<xsl:value-of select="substring-before($text, '&#xa;&#xa;')"/>
    					<xsl:text>&#xa;</xsl:text>
    					<xsl:value-of select="substring-after($text, '&#xa;&#xa;')"/>
    				</xsl:variable>
    				<xsl:call-template name="normalize-line-breaks">
    					<xsl:with-param name="text" select="$text"/>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>


    Centroallee 1000, Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...
    Centroallee 1000, Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...
    
    Centroallee, 1000, Einfahrt, Parkhaus 7 an der, "Alten Waltz" gegenüber Tryp Hotel ...
    Centroallee, 1000, Einfahrt, Parkhaus 7 an der, "Alten Waltz" gegenüber Tryp Hotel ...
    
    Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...
    Centroallee 1000 Einfahrt Parkhaus 7 an der "Alten Waltz" gegenüber Tryp Hotel ...

    Какт так
    В Ваш шаблон уж сами приспособите

    PS: {username}, может есть лучший способ? Буду рад выслушать неравнодушных
    Ответ написан
    Комментировать
  • Как получить элемент с классом по шаблону/маски (xpath)?

    @Roman-Fov
    <root>
    	<div class="class1-s">a</div>
    	<div class="class1_a">b</div>
    	<div class="  class1+g 	">b</div>
    	<div class="class1-s1">c</div>
    	<div class="class1-s134">c</div>
    	<div class="cls1-s134">c</div>
    	<div class="class1-s134">c</div>
    	<div c="zclass1-s1">c</div>
    	<div>c</div>
    </root>


    Есть вариант. Выбираем сначала по starts-with и потом считаем количество символов:
    /root/div[starts-with(normalize-space(@class), 'class1') and string-length(normalize-space(@class)) = string-length('class1') + 2]


    Или если очень хочется регулярок, то:
    /root/div[matches(normalize-space(@class), '^class1..$')]
    Ответ написан
    Комментировать
  • Как преобразовать лог из XML с помощью XSLT?

    @Roman-Fov
    Насколько я знаю, в xml может быть только один корневой элемент.

    Неправильное, но рабочее решение:
    Обернуть все корневые элементы в один новый корневой элемент в блокноте++ вручную и обработать как надо.

    Хорошее решение:
    Генерировать хороший xml
    Ответ написан
    Комментировать