Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Xslt. Ось preceding-sibling:: / 7 сообщений из 7, страница 1 из 1
20.04.2007, 11:11
    #34475265
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
Доброго время суток.
Сижу тут балуюсь (иногда парюсь)с осями.
Есть некоторые вопросы. Хотелось бы выслушать мнения знающих людей по этому поводу.
К примеру:
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
20.04.2007, 13:28
    #34475882
TiG
TiG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
Набросал тут, вроде это тебе надо ?
Код: 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
20.04.2007, 13:58
    #34476000
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
Круто!!!! Огромное спасибо TiG.
Это более чем я мог желать по третьему вопросу.

А что можно сказать по первым двум? Кто нибудь может это объяснить
...
Рейтинг: 0 / 0
20.04.2007, 14:13
    #34476060
TiG
TiG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
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
20.04.2007, 14:42
    #34476221
SuSa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
TiG SuSa2. Почему после оси нельзя написать current() ? или $e равное к примеру тегу 'header'.
Если честно, не понял о чём ты :)
Ну в смысле:
preceding-sibling::current() или
<xsl:variable name="e" select="header'/>
<xsl:value-of select="preceding-sibling::$e"/>
примерно так
...
Рейтинг: 0 / 0
20.04.2007, 14:55
    #34476283
TiG
TiG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
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
25.04.2007, 13:35
    #34486337
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Xslt. Ось preceding-sibling::
SuSapreceding-sibling::current() current() не является фильтром узлов и недопустим в таком контексте. Также ось preceding-sibling не содержит текущего узла.
SuSa<xsl:variable name="e" select="header'/>
<xsl:value-of select="preceding-sibling::$e"/>
примерно таккак фильтровать узлы тебе написали.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Xslt. Ось preceding-sibling:: / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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