xmlhack.ru XML-форумы
Обсуждение XML и связанных с ним технологий

Как правильно присвоить значение атрибуту?


Автор Сообщение
KazaK
Новичок

Зарегистрирован: 16.07.2003
Сообщения: 3

[4693] Ср Июл 16, 2003 15:42
Как правильно присвоить значение атрибуту?
Есть xml следующего вида:

<?xml version="1.0" encoding="UTF-8"?>
<chart>
<name>Первая строка</name>
<name>Вторая строка</name>
<name>Третья строка</name>
</chart>

Почему-то не хочет работать следующий фрагмент XSL:

<xsl:for-each select="//chart/name">
<text x="-96">
<xsl:attribute name="y">
<xsl:value-of select="30*position()"/>
</xsl:attribute>
<xsl:value-of select="."/>
</text>
</xsl:for-each>

При преобразовании возникает следующая ошибка:
y has an illegal attribute: {1}; SystemID: file:///main_short.xsl; Line#: 185; Column#: 33
y has an illegal attribute: {1}; SystemID: file:///main_short.xsl; Line#: 185; Column#: 33
y has an illegal attribute: {1}; SystemID: file:///main_short.xsl; Line#: 185; Column#: 33

В чем может быть дело?
Paranorm
Студент

Зарегистрирован: 24.04.2002
Сообщения: 81

Посетить сайт автора
[4694] Ср Июл 16, 2003 16:28
Reply
Я проверил твой код под XMLSpy - все работает.
Какой у тебя трансформер?
KazaK
Новичок

Зарегистрирован: 16.07.2003
Сообщения: 3

[4695] Ср Июл 16, 2003 16:43
Re: Reply
я юзаю Xalan под JBuilder'ом
Евгений
Новичок

Зарегистрирован: 28.05.2003
Сообщения: 12

[4696] Ср Июл 16, 2003 17:05

У меня под Saxon'ом тоже все пашет...

Может где-то в другом месте XSL ошибка?

Как то было, что парсер указывал на ошибку вообще из другого XSL (мною не создаваемого), простое закоментаривание части кода в моем XSL устраняло проблему... Много времени не стал тратить, поскольку было не особо важное изменение, но факт остается фактом! Как такое может быть? Может профессионалы помогут?
KazaK
Новичок

Зарегистрирован: 16.07.2003
Сообщения: 3

[4701] Чт Июл 17, 2003 14:55

Мне удалось более-менее локализовать проблему. Итак, первый xsl:

<?xml version='1.0' encoding="ISO-8859-5"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<svg xml:space="preserve" x="0in" y="0in" width="29.9672in" height="21.7556in" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality"
viewBox="-5480 0 10878 14983">

<xsl:for-each select="//chart/name">
<text x="-96">
<xsl:attribute name="y">
<xsl:value-of select="264 + 30*position()"/>
</xsl:attribute>
<xsl:value-of select="."/>
</text>
</xsl:for-each>
</svg>
</xsl:template>
</xsl:stylesheet>


При обработке им следующего xml-документа:

<?xml version="1.0" encoding="UTF-8"?>
<chart>
<name>Первая строка</name>
<name>Вторая строка</name>
<name>Третья строка</name>
</chart>

возникает ошибка. Теперь убираю 2 строки из xsl:

<?xml version='1.0' encoding="ISO-8859-5"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<xsl:for-each select="//chart/name">
<text x="-96">
<xsl:attribute name="y">
<xsl:value-of select="264 + 30*position()"/>
</xsl:attribute>
<xsl:value-of select="."/>
</text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


Ошибка пропала. Теперь не могу понять, как влияют убранные строки на работу трансформера.
olpa
Любитель

Зарегистрирован: 23.04.2002
Сообщения: 981
Откуда: Санкт-Петербург
Посетить сайт автора
[4783] Пт Авг 01, 2003 07:33

Принципиальное отличие между двумя примерами кода в том, что первый вариант содержит xml:space="preserve".

У инструкции xsl:attribute есть ряд ограничений, одно из них: узлы атрибутов должны создаваться до создания дочерних узлов других типов. В первом фрагменте, из-за xml:space="preserve", между <text x="-96"> и <xsl:attribute name="y"> есть текстовый узел, содержащий перевод строки. Поэтому XSLT-процессор ругается.

Paranorm использует MSXML, который слишком вольно общается с пробельными символами. Поэтому у него ошибка не проявилась.

Кстати, рекомендую переписать код в духе XSLT:

Код:


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
 <svg xml:space="preserve" x="0in" y="0in" width="29.9672in" height="21.7556in" style="shape-rendering:geometricPrecision; text-rendering:geometricPrecision; image-rendering:optimizeQuality"
viewBox="-5480 0 10878 14983">
 <xsl:apply-templates />
 </svg>
</xsl:template>

<xsl:template match="chart/name">
 <text x="-96" y="{264 + 30*position()}">
  <xsl:value-of select="."/>
 </text>
</xsl:template>

</xsl:stylesheet>