powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Выход из цикла по прерыванию
6 сообщений из 6, страница 1 из 1
XSLT. Выход из цикла по прерыванию
    #34463513
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Вопрос такой кто нибудь уже реализовывал выход из цикла при срабатывании какого либо условия?
Задача такая, есть xml:
Код: plaintext
1.
2.
3.
4.
5.
<root>
<header xml:lang="ru">Образоват. учережд</header>
<header xml:lang="fr">The university </header>
<header xml:lang="fr">university</header>
....
</root>
Нужно по идеи написать условие которе бы удостоверилось что значения xml:lang во всех header'ах уникальны.
Если какой то язык совподает выдать ошибку.
Написал так
Код: plaintext
1.
2.
3.
<xsl:for-each select="//header">
    <xsl:if test="count(//header[@xml:lang=current()/@xml:lang])=1"> Warrning: в элементе с текстом "<xsl:value-of select="."/>" язык повторился :) 
 </xsl:if>
 </xsl:for-each>
Сообщение выводится 2 раза, а надо 1. Т.о при выполнении(срабатывании) данного условия надо выйти из цилка, но грубый выход плана terminate="yes", не подходит, надо лишь выйти из этого условия и перейти к следующему.
Повторю вопрос: КАК реализовать выход из цикла при срабатывании какого либо условия?
или помогите написать альтернативный способ проверки. Желательно с помощь выражения(й) xPath
...
Рейтинг: 0 / 0
XSLT. Выход из цикла по прерыванию
    #34463728
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверять что он не первый такой среди предыдущих братьёв (preceding-sibling::) ?
Или как вариант можно саму проверку по другому реализовать - см. в сторону группировки с помощью ключей (xsl:key).
...
Рейтинг: 0 / 0
XSLT. Выход из цикла по прерыванию
    #34463803
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поподробнее про preceding-sibling:: можно мылсь услышать?
что такое я знаю, а что предлогают в конкретном случаи пока чего то не уловил
про xsl:key - может тогда уж сразу сортировку использовать, отсортировать и сравнивать соседей.
ЗЫ. А из цикла выйти(прервать ) никак?
...
Рейтинг: 0 / 0
XSLT. Выход из цикла по прерыванию
    #34472356
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал такую шнягу:
Код: plaintext
1.
2.
3.
4.
5.
     <xsl:for-each select="//header">
                   <xsl:variable name="a"><xsl:value-of select="preceding-sibling::header/@xml:lang"/></xsl:variable>
                    <xsl:if test="(count(//header[@xml:lang=current()/@xml:lang])!=1) and(contains($a,current()/@xml:lang ))"> 
                        Warrning: в элементе с текстом "<xsl:value-of select="."/>" язык повторился :)
                    </xsl:if>
                </xsl:for-each>
В целом удовлетворяет полностью. Но начальству стало нужно чтоб все это было без цикла и через шаблон.
Т.Е. примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
     <xsl:template match="//header">
                   <xsl:variable name="a"><xsl:value-of select="preceding-sibling::header/@xml:lang"/></xsl:variable>
                    <xsl:if test="(count(//header[@xml:lang=current()/@xml:lang])!=1) and(contains($a,current()/@xml:lang ))"> 
                        Warrning: в элементе с текстом "<xsl:value-of select="."/>" язык повторился :)
                    </xsl:if>
                </xsl:template>
<xsl:template match="text()"/>
   <xsl:template match="/">
      <xsl:apply-templates/>
   </xsl:template>
Однако в таком виде и таком использовании preceding-sibling::header/@xml:lang все время возращает пустую строку("") не зависимо от того на какой строке стоит.
Народ!!! как сделать?!!
...
Рейтинг: 0 / 0
XSLT. Выход из цикла по прерыванию
    #34472937
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё!! все заработало
код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<xsl:template match="//header">
                   <xsl:variable name="a"><xsl:value-of select="preceding-sibling::header/@xml:lang"/></xsl:variable>
                    <xsl:if test="(count(//header[@xml:lang=current()/@xml:lang])!=1) and(contains($a,current()/@xml:lang ))"> 
                        Warrning: в элементе с текстом "<xsl:value-of select="."/>" язык повторился :)
                    </xsl:if>
                </xsl:template>
<xsl:template match="text()"/>
   <xsl:template match="/">
      <xsl:apply-templates/>
   </xsl:template>
Был верен. Просто проверял на некоректном документе. Вод и выходили все время пустые строки.
Кстати кто сможет объяснить разницу между:
Код: plaintext
1.
2.
 <xsl:variable name="a">
<xsl:value-of select="preceding-sibling::header/@xml:lang"/>
</xsl:variable>
и
Код: plaintext
 <xsl:variable name="a" select="preceding-sibling::header/@xml:lang"/>
С первым пример проходит, со вторым выдает ошибки
...
Рейтинг: 0 / 0
XSLT. Выход из цикла по прерыванию
    #34482158
anji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<xsl:template match="/">
	<xsl:apply-templates select="root/header"/>
</xsl:template>

<xsl:template match="header">
	<xsl:choose>
		<xsl:when test="preceding-sibling::header/@xml:lang = @xml:lang">
			<xsl:value-of select="@xml:lang"/> is repeated, do nothing here...
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="@xml:lang"/>
		</xsl:otherwise>
	</xsl:choose>
	<br/>
</xsl:template>
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / XSLT. Выход из цикла по прерыванию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]