powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Переменные в XSL
9 сообщений из 9, страница 1 из 1
Переменные в XSL
    #33454712
Sergey G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть данные XML:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
<root>
<customer id="1"
        auxid="10011998100360610"
        name="..." type="1" group="1" number="...">
        <connection id="1"
                type="PLAN1">
                <passwd id="1" identifier="naz"
                    started="1997-01-01"
                    expired="1999-10-30"
                />
        </connection>
</customer>
</root>

Надо получить текстовый файл, в каждой строке которого:
auxid,identifier,started,expired

Пытаюсь для этого заюзать переменную, aid, не получается... Что я делаю не так?

Вот XSL:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:a="uri:a"
   exclude-result-prefixes="xsl">
<xsl:output encoding="windows-1251" standalone="no" method="text" omit-xml-declaration="yes" indent="no"/>

<!--xsl:template match="/">
  <xsl:apply-templates select="root/customer"/>
</xsl:template-->

<xsl:template match="customer"><xsl:variable name="a:aid" select="@auxid"/><xsl:apply-templates select="connection/passwd"/></xsl:template>

<xsl:template match="passwd"><xsl:value-of select="$a:aid"/>;<xsl:value-of select="@identifier"/>;<xsl:value-of select="@started"/>;<xsl:value-of select="@expired"/><xsl:text>
</xsl:text></xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Переменные в XSL
    #33454790
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
<xsl:value-of select="a:$aid"/>
и для чего вообще понадобился namespace для переменной?
без namespace:
Код: plaintext
1.
2.
<xsl:variable name="aid" select="@auxid"/>
...
<xsl:value-of select="$aid"/>
...
Рейтинг: 0 / 0
Переменные в XSL
    #33454876
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй без переменной.
выглядит примерно так...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output encoding="windows-1251" standalone="no" method="text"
omit-xml-declaration="yes" indent="no"/>

<xsl:template match="/root/customer">
  <xsl:value-of select="@auxid"/>;
  <xsl:apply-templates select="connection/passwd"/>
</xsl:template>

<xsl:template match="passwd">
<xsl:value-of select="@identifier"/>;
<xsl:value-of select="@started"/>;
<xsl:value-of select="@expired"/><xsl:text>
</xsl:text></xsl:template>

</xsl:stylesheet>
...
Рейтинг: 0 / 0
Переменные в XSL
    #33454879
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман Дынник...и для чего вообще понадобился namespace для переменной?
...

Можно спросить и так: "и для чего вообще понадобилась переменная?"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
<xsl:template match="passwd">
  <xsl:value-of select="ancestor::customer/@auxid"/>;
  <xsl:value-of select="@identifier"/>;
  <xsl:value-of select="@started"/>;
  <xsl:value-of select="@expired"/>
  <xsl:text></xsl:text>
</xsl:template>...

Такой шаблон для элемента passwd даст вам все, что вам требуется без всякой переменной...

З.Ы. а по поводу ошибки с именем переменной - там же ясно сказано: "A reference to variable or parameter '{uri:a}aid' cannot be resolved.
The variable or parameter may not be defined, or it may not be in scope." (ключевое слово scope , т.к. за defined мы "отвечаем").
Очевидно, переменную можно использовать только "внутри" того шаблона, в котором она определена, но не другого (независимого), хотя явных указаний на это в описании тега <xsl:variable> и нет... Но, догадаться путем нехитрых манипуляций с помещением <xsl:variable> в разные места шаблона, по-моему, нетрудно...
...
Рейтинг: 0 / 0
Переменные в XSL
    #33455359
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно определить две переменные с одним именем в одном скопе, тогда парсер вам всё про скопы расскажет :)
передавать переменные можно вызывая <apply-templates><with-param/></apply-templates>
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Переменные в XSL
    #33456691
Sergey G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
M0usпопробуй без переменной.
выглядит примерно так...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output encoding="windows-1251" standalone="no" method="text"
omit-xml-declaration="yes" indent="no"/>

<xsl:template match="/root/customer">
  <xsl:value-of select="@auxid"/>;
  <xsl:apply-templates select="connection/passwd"/>
</xsl:template>

<xsl:template match="passwd">
<xsl:value-of select="@identifier"/>;
<xsl:value-of select="@started"/>;
<xsl:value-of select="@expired"/><xsl:text>
</xsl:text></xsl:template>

</xsl:stylesheet>


Так оно, конечно, работает, но: saxon под вынь выдает так:
Код: plaintext
1.
2.
3.
4.
 10011998100360610 ;
  naz;
 1997 - 01 - 01 ;
 1999 - 10 - 30 
А надо так:

Код: plaintext
1.
 10011998100360610 ;naz; 1997 - 01 - 01 ; 1999 - 10 - 30 

И второе: мне эти строки нужно выводить условно: не выводить, если expired < 2005-01-01
...
Рейтинг: 0 / 0
Переменные в XSL
    #33456709
Sergey G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu
Можно спросить и так: "и для чего вообще понадобилась переменная?"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
...
<xsl:template match="passwd">
  <xsl:value-of select="ancestor::customer/@auxid"/>;
  <xsl:value-of select="@identifier"/>;
  <xsl:value-of select="@started"/>;
  <xsl:value-of select="@expired"/>
  <xsl:text></xsl:text>
</xsl:template>...

Такой шаблон для элемента passwd даст вам все, что вам требуется без всякой переменной...

З.Ы. а по поводу ошибки с именем переменной - там же ясно сказано: "A reference to variable or parameter '{uri:a}aid' cannot be resolved.
The variable or parameter may not be defined, or it may not be in scope." (ключевое слово scope , т.к. за defined мы "отвечаем").
Очевидно, переменную можно использовать только "внутри" того шаблона, в котором она определена, но не другого (независимого), хотя явных указаний на это в описании тега <xsl:variable> и нет... Но, догадаться путем нехитрых манипуляций с помещением <xsl:variable> в разные места шаблона, по-моему, нетрудно...

Спасибо, твой способ работает, только выдает на выходе много пустых строк, и вывод начинается не с 1-й позиции в строке, а где-то с 17й (может, 2 таба впереди...).

По поводу переменной, я пробовал указывать и без префикса, выводилась пустая строка, либо говорилось, что такая не определена... (не помню точно)

То есть как с переменными? их можно использовать только в одном шаблоне <xslt:template>..... </xslt:template> ?
...
Рейтинг: 0 / 0
Переменные в XSL
    #33456863
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey GТо есть как с переменными? их можно использовать только в одном шаблоне <xslt:template>..... </xslt:template> ?
где объявите, там и будете использовать.
если она глобальная, то ее значение доступно везде.
если локальная, то в рамках того уровня, где она описана.
...
Рейтинг: 0 / 0
Переменные в XSL
    #33456912
M0us
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Gмне эти строки нужно выводить условно: не выводить, если expired < 2005-01-01

сразу надо предупреждать...

Код: plaintext
1.
2.
3.
4.
5.
<xsl:if test="number(substring(@expired, 1, 4))>number(2005) and
number(substring(@expired, 6, 2))>number(01) and
number(substring(@expired, 8, 2))>number(01)">
<xsl:apply-templates match="passwd"/>
</xls:if>

ЗЫ использовать вместе с примером qu-qu
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Переменные в XSL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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