XSLT: как воспользоваться regex-ом при выборе элемента с атрибутом
xml:
<?xml-stylesheet type="text/xsl" href="xsl.xsl"?>
<data>
<element attr="abracadabra" />
<element attr="exterminatus" />
<element attr="kukaracha" />
<element attr="chupacabra" />
</data>
xslt: данная xslt-шка печатает в h1 все атрибуты, содержащие подстроку 'ra':
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data">
<xsl:for-each select="element">
<xsl:if test="contains(@attr, 'ra')">
<h1>
<xsl:value-of select="@attr"/>
</h1>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Попробуй замени contains на matches, а во втором параметре введи regex - если заработает, то все круто
у меня примерно так:
есть текст, разреженный заголовками. примерно следующего вида:
<text>
<header class="level1 1432AD423">Заголовок</header>
<header class="level2 76EF4EDA">подзаголовок</header>
Фузз дает септаккорд, однако сами песни забываются очень быстро. Крещендирующее
рождение случайно. Как было показано выше, доминантсептаккорд продолжает
соноропериод, и здесь в качестве модуса конструктивных элементов используется ряд
каких-либо единых длительностей. Арпеджио однократно.
<header class="level2 96F341DE">подзаголовок</header>
Пуанта трансформирует неизменный райдер, как и реверансы в сторону ранних "роллингов".
Струна, в том числе, всекомпонентна. Очевидно, что midi-контроллер иллюстрирует
громкостнoй прогрессийный период, не говоря уже о том, что рок-н-ролл мертв. Фаза, на
первый взгляд, представляет собой соноропериод, это и есть одномоментная вертикаль в
сверхмногоголосной полифонической ткани. Соноропериод имеет композиционный open-air, о
чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в
Германии". Асинхронное ритмическое поле использует неизменный ревер, а после исполнения
Утесовым роли Потехина в "Веселых ребятах" слава артиста стала всенародной.
<header class="level1 BE43DAF475">Заголовок</header>
Аллюзийно-полистилистическая композиция, в первом приближении, mezzo forte просветляет
композиционный сет, и если в одних голосах или пластах музыкальной ткани сочинения еще
продолжаются конструктивно-композиционные процессы предыдущей части, то в других -
происходит становление новых. Аллегро mezzo forte продолжает неизменный цикл, о чем
подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в
Германии". Техника, как бы это ни казалось парадоксальным, трансформирует лирический
гипнотический рифф, о чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее
музыкальное движение в Германии". Асинхронное ритмическое поле заканчивает хорус, на
этих моментах останавливаются Мазель Л.А. и Цуккерман В.А. в своем "Анализе музыкальных
произведений".
</text>
т.е. заголовки и подзаголовки выделены тегами <header>, однако в class кроме названия уровня содержится ещё какой-то хеш, который нафиг не нужен. точнее, он нужен, потому что на него есть ссылки. но ссылки мне пока не интересны. мне нужно нормальную структуру сделать
почему создатели текста не вынесли хеш в другой атрибут? - потому что пидорасы
как можно называть человека пидорасом, не зная его мотивации?
for-each насколько я понимаю, несколько не так работает.В смысле? for-each - просто проход по всему, что ты в нем указал - он именно так работает.
мне нужно нормальную структуру сделать
Какая структура для тебя нормальная?
<?xml version="1.0" encoding="utf-8"?>
<text>
<header class="level1" hash="1432AD423">Заголовок</header>
<header class="level2" hash="76EF4EDA">подзаголовок</header>
Фузз дает септаккорд, однако сами песни забываются очень быстро. Крещендирующее
рождение случайно. Как было показано выше, доминантсептаккорд продолжает
соноропериод, и здесь в качестве модуса конструктивных элементов используется ряд
каких-либо единых длительностей. Арпеджио однократно.
<header class="level2" hash="96F341DE">подзаголовок</header>
Пуанта трансформирует неизменный райдер, как и реверансы в сторону ранних "роллингов".
Струна, в том числе, всекомпонентна. Очевидно, что midi-контроллер иллюстрирует
громкостнoй прогрессийный период, не говоря уже о том, что рок-н-ролл мертв. Фаза, на
первый взгляд, представляет собой соноропериод, это и есть одномоментная вертикаль в
сверхмногоголосной полифонической ткани. Соноропериод имеет композиционный open-air, о
чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в
Германии". Асинхронное ритмическое поле использует неизменный ревер, а после исполнения
Утесовым роли Потехина в "Веселых ребятах" слава артиста стала всенародной.
<header class="level1" hash="BE43DAF475">Заголовок</header>
Аллюзийно-полистилистическая композиция, в первом приближении, mezzo forte просветляет
композиционный сет, и если в одних голосах или пластах музыкальной ткани сочинения еще
продолжаются конструктивно-композиционные процессы предыдущей части, то в других -
происходит становление новых. Аллегро mezzo forte продолжает неизменный цикл, о чем
подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее музыкальное движение в
Германии". Техника, как бы это ни казалось парадоксальным, трансформирует лирический
гипнотический рифф, о чем подробно говорится в книге М.Друскина "Ганс Эйслер и рабочее
музыкальное движение в Германии". Асинхронное ритмическое поле заканчивает хорус, на
этих моментах останавливаются Мазель Л.А. и Цуккерман В.А. в своем "Анализе музыкальных
произведений".
</text>
Вот сама xslt-шка:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/text">
<text>
<xsl:for-each select="node">
<xsl:choose>
<xsl:when test="name = 'header'">
<header>
<xsl:attribute name="class">
<xsl:value-of select="substring-before(@class, ' ')"/>
</xsl:attribute>
<xsl:attribute name="hash">
<xsl:value-of select="substring-after(@class, ' ')"/>
</xsl:attribute>
<xsl:for-each select="node">
<xsl:copy-of select="." />
</xsl:for-each>
</header>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</text>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/data/element[contains(@attr, 'ra')]">
<h1>
<xsl:value-of select="@attr"/>
</h1>
</xsl:template>
</xsl:stylesheet>
за for-each надо сразу xsl отбирать!Ну да, здесь лоханулся. Ну а второй пример?
Кстати, а намного что ли тормознее будет работать? Я в xslt не силен, а в производительности уж подавно
проще говоря, ты не силен ни в производительности, ни в её отсутствии. %
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/text">
<text>
<xsl:apply-templates/>
</text>
</xsl:template>
<xsl:template match="*">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="header">
<header class="{substring-before(@class, ' ')}" hash="{substring-after(@class, ' ')}">
<xsl:apply-templates/>
</header>
</xsl:template>
</xsl:stylesheet>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="header">
<header class="{substring-before(@class, ' ')}" hash="{substring-after(@class, ' ')}">
<xsl:apply-templates/>
</header>
</xsl:template>
</xsl:stylesheet>
Оставить комментарий
yolki
i.e. нужно выбрать те <element> у которых значение атрибута удовлетворяет некоторому regex-у.именно:
нужно выбрать те, в которых в attr matches .*ra.*