XSLT: как воспользоваться regex-ом при выборе элемента с атрибутом

yolki

i.e. нужно выбрать те <element> у которых значение атрибута удовлетворяет некоторому regex-у.
именно:

<element attr="abracadabra" />
<element attr="exterminatus" />
<element attr="kukaracha" />
<element attr="chupacabra" />

нужно выбрать те, в которых в attr matches .*ra.*

agent007new

Если твой XSLT-процессор не реализует XPath 2.0 (мой MSXML 6.0 не реализует то по 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 - если заработает, то все круто

yolki

for-each насколько я понимаю, несколько не так работает.
у меня примерно так:
есть текст, разреженный заголовками. примерно следующего вида:

<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 кроме названия уровня содержится ещё какой-то хеш, который нафиг не нужен. точнее, он нужен, потому что на него есть ссылки. но ссылки мне пока не интересны. мне нужно нормальную структуру сделать
почему создатели текста не вынесли хеш в другой атрибут? - потому что пидорасы

Bibi

как можно называть человека пидорасом, не зная его мотивации?

agent007new

for-each насколько я понимаю, несколько не так работает.
В смысле? for-each - просто проход по всему, что ты в нем указал - он именно так работает.
мне нужно нормальную структуру сделать

Какая структура для тебя нормальная?

agent007new

Вот пример xslt-шки, которая выдает тот же самый документ, в котором атрибут class заменен на два атрибута class и hash по разделяющему пробелу в исходном значении атрибута. Т.е. на твой xml будет выдан следующий результат:
<?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>

rosali

за for-each надо сразу xsl отбирать! ;)

<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>

agent007new

за for-each надо сразу xsl отбирать!
Ну да, здесь лоханулся. Ну а второй пример?

agent007new

Кстати, а намного что ли тормознее будет работать? Я в xslt не силен, а в производительности уж подавно

slonishka

проще говоря, ты не силен ни в производительности, ни в её отсутствии. %

rosali

да при чем тут производительность, своими for-each/choose/if ты абьюзишь xsl на корню, ты программируешь как бы на сиплюсплюсе, но в синтаксисе xsl. ну нельзя же так ей богу :) второй пример _на xsl_ пишется вот так:

<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>

Vyacha

или даже

<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>
Оставить комментарий
Имя или ник:
Комментарий: