powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / текст в CDATA как узлы выходного файла
9 сообщений из 9, страница 1 из 1
текст в CDATA как узлы выходного файла
    #38940082
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, просьба разъяснить.
Требуется создавать многоуровневый список из перечня узлов (уровень в зависимости от атрибутов).
На входе XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0"?>
<?xml-stylesheet href="listProcess.xsl" type="text/xsl"?>
<!DOCTYPE main []>
<main>
	<node s1="1" s2="1" s3="1"/>
	<node s1="1" s2="2" s3="1"/>
	<node s1="1" s2="2" s3="2"/>
	<node s1="1" s2="2" s3="3"/>
	<node s1="1" s2="3" s3="1"/>
	<node s1="2" s2="1" s3="1"/>
	<node s1="2" s2="1" s3="2"/>
</main>


listProcess.xsl
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" encoding="UTF-8"/>

	<xsl:template match="/">
		<html>
			<head/>
			<body>
				<ul>
					<xsl:apply-templates/>
				</ul>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="node">
	<xsl:text disable-output-escaping="yes"><![CDATA[<li>]]></xsl:text>
		<xsl:value-of select="@s1"/>
		<xsl:value-of select="@s2"/>
		<xsl:value-of select="@s3"/>
	<xsl:text disable-output-escaping="yes"><![CDATA[</li>]]></xsl:text>
	</xsl:template>
</xsl:stylesheet>



В IE XML отображается списком. В FF "написанный" <li> остается текстовым узлом. Как сделать <li> узлом для FF?
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38940116
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите пример XML, который хочется получить?
Код: xml
1.
2.
3.
4.
5.
6.
7.
<xsl:template match="node">
	<li>
		<xsl:value-of select="@s1"/>
		<xsl:value-of select="@s2"/>
		<xsl:value-of select="@s3"/>
	</li>
</xsl:template>

Так?
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38940136
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данном примере получить хочу
Код: xml
1.
2.
3.
4.
5.
6.
<ul>
  <li>111</li>
  <li>121</li>
  ...
  <li>212</li>
<ul>


Структура не важна - проблема в отображении в FF
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38940146
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sa4ikoВ данном примере получить хочу 17536040
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38940202
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне требуется CDATA. В реальной задаче строю многоуровневое дерево.
Для каждого node в зависимости от предыдущего открывается/закрывается <ul><li>

IE воспринимает написанное в CDATA как узлы, FF видит текст.
xml тот же,
xsl:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="html" encoding="UTF-8"/>

	<xsl:template match="/">
		<html>
			<head/>
			<body>
				<ul>
					<xsl:apply-templates/>
				</ul>
			</body>
		</html>
	</xsl:template>
	<xsl:template match="node">
		<xsl:if test="not(preceding-sibling::*[1]/@s1 = @s1)">
			<xsl:if test="position() != 1">
				<xsl:text disable-output-escaping="yes"><![CDATA[</ul></li></ul></li>]]></xsl:text>
			</xsl:if>
			<xsl:text disable-output-escaping="yes"><![CDATA[<li>level s1=]]></xsl:text>
			<xsl:value-of select="@s1"/>
			<xsl:text disable-output-escaping="yes"><![CDATA[<ul>]]></xsl:text>
		</xsl:if>
		<xsl:if test="not(preceding-sibling::*[1]/@s2 = @s2)">
			<xsl:if test="preceding-sibling::*[1]/@s1 = @s1">
				<xsl:text disable-output-escaping="yes"><![CDATA[</ul></li>]]></xsl:text>
			</xsl:if>
			<xsl:text disable-output-escaping="yes"><![CDATA[<li>level s2=]]></xsl:text>
			<xsl:value-of select="@s2"/>
			<xsl:text disable-output-escaping="yes"><![CDATA[<ul>]]></xsl:text>
		</xsl:if>
		<li>
			<xsl:value-of select="concat('node ',@s1,@s2,@s3)"/>
		</li>
		<xsl:if test="position() = last()">
			<xsl:text disable-output-escaping="yes"><![CDATA[</ul></li></ul></li>]]></xsl:text>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>



Требуется получить:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<ul>
	<li>level s1=1
		<ul>
			<li>level s2=1
				<ul>
					<li>node 111</li>
				</ul>
			</li>
			<li>level s2=2
				<ul>
					<li>node 121</li>
					<li>node 122</li>
					<li>node 123</li>
				</ul>
			</li>
			<li>level s2=3
				<ul>
					<li>node 131</li>
				</ul>
			</li>
		</ul>
	</li>
	<li>level s1=2
		<ul>
			<li>level s2=1
				<ul>
					<li>node 211</li>
					<li>node 212</li>
				</ul>
			</li>
		</ul>
	</li>
</ul>
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38940235
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
<xsl:text disable-output-escaping="yes">&lt;li&gt;</xsl:text>


Да, и глобальный совет - откажитесь от XSL преобразования на клиенте. Делайте все на сервере. А клиенту отдавайте готовый html. Поверьте, количество проблем сократится в разы
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38941100
sa4iko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, FF по-прежнему выводит:

Код: plaintext
1.
</ul></li></ul></li><li>level s1=1<ul><li>level s2=1<ul>
node 111
</ul></li><li>level s2=2<ul>

node 121

node 122

node 123
</ul></li><li>level s2=3<ul>

node 131
</ul></li></ul></li><li>level s1=2<ul><li>level s2=1<ul>

node 211

node 212
То есть он печатает список только у "явно" созданных <li>
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38941159
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sa4ikoНет, FF по-прежнему выводит:_Vasilisk_Да, и глобальный совет - откажитесь от XSL преобразования на клиенте. Делайте все на сервере. А клиенту отдавайте готовый html. Поверьте, количество проблем сократится в разы
...
Рейтинг: 0 / 0
текст в CDATA как узлы выходного файла
    #38941171
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="html" encoding="UTF-8"/>

  <xsl:template match="/">
    <html>
      <head/>
      <body>
        <ul>
          <xsl:apply-templates/>
        </ul>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="node">
    <xsl:if test="not(preceding-sibling::*[1]/@s1 = @s1)">
      <ul>
        <li>
          level s1=
          <xsl:value-of select="@s1"/>
          <ul>
            <xsl:apply-templates select="../node[@s1 = current()/@s1]" mode="level1"/>
          </ul>
        </li>
      </ul>
    </xsl:if>
  </xsl:template>

  <xsl:template match="node" mode="level1">
    <xsl:if test="not(preceding-sibling::*[1]/@s2 = @s2)">
      <li>
        level s2=
        <xsl:value-of select="@s2"/>
        <ul>
          <xsl:apply-templates select="../node[@s2 = current()/@s2 and @s1 = current()/@s1]" mode="level2"/>
        </ul>
      </li>
    </xsl:if>
  </xsl:template>

  <xsl:template match="node" mode="level2">
    <li>
      <xsl:value-of select="concat('node ',@s1,@s2,@s3)"/>
    </li>
  </xsl:template>

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


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