powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Xslt. Ось preceding-sibling::
7 сообщений из 7, страница 1 из 1
Xslt. Ось preceding-sibling::
    #34475265
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго время суток.
Сижу тут балуюсь (иногда парюсь)с осями.
Есть некоторые вопросы. Хотелось бы выслушать мнения знающих людей по этому поводу.
К примеру:
1. В чем разница между:
Код: plaintext
1.
2.
<xsl:variable name="b"> 
   <xsl:value-of select="preceding-sibling::node()/@xml:lang"/> 
 </xsl:variable>
и
Код: plaintext
<xsl:variable name="b" select="preceding-sibling::node()/@xml:lang"/>
Со вторым кодом документ валиден, но при парсенге вылазят ошибки.
2. Почему после оси нельзя написать current() ? или $e равное к примеру тегу 'header'.
3. Можно ли как нить отгородить значения относящиеся к одноименным тегам во время присваения переменной значения. К примеру есть xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
<Office-memo>
 <header xml:lang="ru">Text</header>
 <header xml:lang="en">Text2</header>
 <header xml:lang="ru">Text3</header>
 <header xml:lang="en">Text4</header>

 <university xml:lang="ja">'Text5'</university>
 <university xml:lang="ja">'Text6'</university>
</Office-memo>
И если провернуть
Код: plaintext
1.
2.
<xsl:variable name="b"> 
   <xsl:value-of select="preceding-sibling::node()/@xml:lang"/> 
 </xsl:variable>
То значение b='ru en ru en ja ja'. А надо только языки относящиелся к примеру к тегам university, то есть b='ja ja'.
Я понимаю что можно выделить одноименые теги в какой нить один общий, но это приведет к переделованию слишком многих уже сделанных работ.
Можно написать условие (xsl:if) которое будет проверять одноименност имен. Но сделать так немогу, потому что данный код формируется другой программой, в ходе преобразования одно файла в другой, и вностить изменения в конечный вариант я права не имею.
Пока всё.
Буду очень благодарен за толковые ответы
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34475882
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Набросал тут, вроде это тебе надо ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="Windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="Windows-1251"/>

<xsl:template match="/">
  <res>

  <xsl:for-each select="Office-memo/*">
    <xsl:copy>
      Same preceding langs = <xsl:value-of select="count(preceding-sibling::*[name()=name(current()) and @xml:lang = current()/@xml:lang])"/>
    </xsl:copy>
  </xsl:for-each>

  </res>
</xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34476000
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Круто!!!! Огромное спасибо TiG.
Это более чем я мог желать по третьему вопросу.

А что можно сказать по первым двум? Кто нибудь может это объяснить
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34476060
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSa1. В чем разница между:
Код: plaintext
1.
2.
<xsl:variable name="b"> 
   <xsl:value-of select="preceding-sibling::node()/@xml:lang"/> 
 </xsl:variable>
и
Код: plaintext
<xsl:variable name="b" select="preceding-sibling::node()/@xml:lang"/>
Со вторым кодом документ валиден, но при парсенге вылазят ошибки.
Не знаю, у меня всё ок. Скорее ты что-то не то потом с этой переменной делаешь.
А разница в том, что в первом $b содержит текстовое представление узла, а во втором - node set.

SuSa2. Почему после оси нельзя написать current() ? или $e равное к примеру тегу 'header'.


Если честно, не понял о чём ты :)
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34476221
SuSa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TiG SuSa2. Почему после оси нельзя написать current() ? или $e равное к примеру тегу 'header'.
Если честно, не понял о чём ты :)
Ну в смысле:
preceding-sibling::current() или
<xsl:variable name="e" select="header'/>
<xsl:value-of select="preceding-sibling::$e"/>
примерно так
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34476283
TiG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSaНу в смысле:
preceding-sibling::current() или
<xsl:variable name="e" select="header'/>
<xsl:value-of select="preceding-sibling::$e"/>
примерно так
А что ты хотел таким образом получить ?

XPath Reference
Location Steps
A location step selects a set of nodes (a node-set) relative to the context node.

There are three parts to a location step: an optional axis, a node test, and an optional predicate. The syntax for a location step is the axis name followed by a double colon, then the node test, and finally zero or more predicates, each in square brackets. The most basic form of this syntax is as follows:

axis::nodetest[predicate]

axis
Specifies the tree relationship between the context node and the nodes to be selected by the location step. In other words, the axis indicates the general direction that the location step proceeds from the context node. In a location step, the axis is optional. If omitted, the axis defaults to child::. Furthermore, several axes have shortcut forms; for instance, the ampersand (@) character is a shortcut for the attribute axis.

nodetest
Specifies the node type or expanded name of the nodes to be initially selected by the location step. Basically, the node test indicates which node(s), from among all nodes on the indicated axis, to consider as candidates, that is, potential, matches for the location step.

predicate
Uses an XPath expression (condition to be met) to further refine the set of nodes selected by the location step. The predicate is a filter, specifying a selection criterion for further refining the list of candidate nodes. The predicate is optional. If there is no predicate, there are no square brackets ([ and ]) in the location step.
...
Рейтинг: 0 / 0
Xslt. Ось preceding-sibling::
    #34486337
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SuSapreceding-sibling::current() current() не является фильтром узлов и недопустим в таком контексте. Также ось preceding-sibling не содержит текущего узла.
SuSa<xsl:variable name="e" select="header'/>
<xsl:value-of select="preceding-sibling::$e"/>
примерно таккак фильтровать узлы тебе написали.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Xslt. Ось preceding-sibling::
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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