powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xml из текста
4 сообщений из 4, страница 1 из 1
xml из текста
    #37468510
Астарот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть некий xml, который возвращает внешний сервер. В этом xml'е много всего, плюс кое что нужное конкретно мне. Это что-то - xml, полученный путем склейки текста, и обернутый в CDATA, то есть на входе что-то типа такого:
автор<?xml version="1.0" encoding="UTF-8"?>
<tag>
<tag2>12345</tag2>
<xml><![CDATA[
<group>
<oper>op1</oper>
<oper>op2</oper>
<oper>op3</oper>
<group2>
<oper>op4</oper>
<oper>op5</oper>
</group2>
</group>
]]></xml>
<tag3>abcd</tag3>
</tag>
Вот то, что лежит в теге <xml> мне и нужно. Проблема в том, что у меня содержимое выкусывается как текст :( А мне нужен xml. То есть нужно не просто выкусить, но и прогнать через свои шаблончики, преобразовать, и все такое. А как я прогоню, если процессор считает, что это текст... Влиять на входной формат возможности нет, то есть есть, но лишь на содержимое тега <xml>, т.е. внутрь CDATA могу дописать что угодно, если вдруг надо. С какой стороны подойти к решению что-то не соображу, нужно средствами xslt 1.0
...
Рейтинг: 0 / 0
xml из текста
    #37469537
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Астарот,

Есть такая проблема, причем с СиДатой у трансформера особое отношение, он ее никак не хочет переворачивать простым реплейсом.
Я обычно это решал приходом к программистам с мотиватором (битой) и XML становился, резко, нормальным.

Есть очень опасный и не шибко шустрый способ решения вашей проблемы, если данные не большие по объему и валидные, можно попробывать их разобрать самостоятельно. Изобразить из себя sax-парсер средствами XSL. Надо заметить, давно я так не развлекался. :-))


Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output encoding="windows-1251" indent="yes" method="html" />
	
<xsl:template match="/">
	<html>
	<body>
		<xsl:variable name="_fragment">
			<xsl:call-template name="sax-emu">
				<xsl:with-param name="str" select="tag/xml" />
			</xsl:call-template>
		</xsl:variable>

		<xsl:variable name="fragment" select="msxsl:node-set($_fragment)" />

		<xsl:value-of select="count($fragment//oper)" />
	</body>
	</html>
</xsl:template>

<xsl:template name="sax-emu">
	<xsl:param name="str" />

	<xsl:choose>
		<xsl:when test="contains( $str, '&lt;' )">
			<xsl:value-of disable-output-escaping="yes" select="substring-before( $str, '&lt;' )" />
			<xsl:choose>
				<xsl:when test="contains( $str, '&gt;' )">
					<xsl:variable name="weak-tag" select="substring-before( substring-after( $str, '&lt;' ), '&gt;' )" />
					<xsl:variable name="has-attr" select="contains( $weak-tag, ' ')" />
					<xsl:variable name="tag-name">
						<xsl:choose>
							<xsl:when test="$has-attr">
								<xsl:value-of select="substring-before( $weak-tag, ' ' )" />
							</xsl:when>
							<xsl:otherwise>
								<xsl:value-of select="$weak-tag" />
							</xsl:otherwise>
						</xsl:choose>
					</xsl:variable>
					<xsl:choose>
						<xsl:when test="substring( $weak-tag, string-length( $weak-tag )) = '/'">
							<!-- simple tag -->
							<xsl:choose>
								<xsl:when test="$has-attr">
									<xsl:element name="{$tag-name}">
										<xsl:call-template name="build-attr">
											<xsl:with-param name="str" select="substring-after( $weak-tag, concat( $tag-name, ' ' ))" />
										</xsl:call-template>
									</xsl:element>
								</xsl:when>
								<xsl:otherwise>
									<xsl:element name="{$tag-name}" />
								</xsl:otherwise>
							</xsl:choose>
							<xsl:call-template name="sax-emu">
								<xsl:with-param name="str" select="substring-after( $str, concat( '&lt;', $tag-name, '&gt;' ))" />
							</xsl:call-template>
						</xsl:when>
						<xsl:otherwise>
							<!-- owner tag -->
							<xsl:choose>
								<xsl:when test="$has-attr">
									<xsl:element name="{$tag-name}">
										<xsl:call-template name="build-attr">
											<xsl:with-param name="str" select="substring-after( $weak-tag, concat( $tag-name, ' ' ))" />
										</xsl:call-template>
										<xsl:call-template name="sax-emu">
											<xsl:with-param name="str" select="substring-before( substring-after( $str, concat( '&lt;', $weak-tag, '&gt;' )), concat( '&lt;/', $tag-name, '&gt;' ))" />
										</xsl:call-template>
									</xsl:element>
								</xsl:when>
								<xsl:otherwise>
									<xsl:element name="{$tag-name}">
										<xsl:call-template name="sax-emu">
											<xsl:with-param name="str" select="substring-before( substring-after( $str, concat( '&lt;', $weak-tag, '&gt;' )), concat( '&lt;/', $tag-name, '&gt;' ))" />
										</xsl:call-template>
									</xsl:element>
								</xsl:otherwise>
							</xsl:choose>
							<xsl:call-template name="sax-emu">
								<xsl:with-param name="str" select="substring-after( $str, concat( '&lt;/', $tag-name, '&gt;' ))" />
							</xsl:call-template>
						</xsl:otherwise>
					</xsl:choose>
				</xsl:when>
				<xsl:otherwise>
					<!-- tag error -->
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of disable-output-escaping="yes" select="$str" />
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>
<xsl:template name="build-attr">
	<xsl:param name="str" />

	<xsl:if test="contains( $str, '=&quot;' )">
		<xsl:if test="contains( substring-after( $str, '=&quot;' ), '&quot;' )">
			<xsl:variable name="attr-name" select="substring-before( $str, '=&quot;' )" />
			<xsl:variable name="attr-value" select="substring-before( substring-after( $str, '=&quot;' ), '&quot;' )" />
			<xsl:attribute name="{$attr-name}">
				<xsl:value-of select="$attr-value" />
			</xsl:attribute>
			<xsl:call-template name="build-attr">
				<xsl:with-param name="str" select="substring-after( $str, concat( $attr-name, '=&quot;', $attr-value, '&quot; ' ))" />
			</xsl:call-template>
		</xsl:if>
		<!-- else: attr-error -->
	</xsl:if>
	<!-- else: attr-error -->
</xsl:template>
</xsl:stylesheet>


превращение переменной в дерево
это вариант для мелкомягких:
<xsl:variable name="fragment" select="msxsl:node-set($_fragment)" />

на других трансформерах будет что-то вроде:
<xsl:variable name="fragment" select="nodeset($_fragment)" />
или
<xsl:variable name="fragment" select="node-set($_fragment)" />
надо смотреть доку на конкретный.
...
Рейтинг: 0 / 0
xml из текста
    #37469559
Астарот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маааааатерь божья... Казалось бы фундаментальная проблема, а через такую задницу решается. За развернутый ответ спасибо, попытаюсь понять как это все должно работать =)
...
Рейтинг: 0 / 0
xml из текста
    #37469595
mage.lan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уменьшил количество бреда, проверил пустые теги...
если в атрибутах будет последовательность '\"' работать не будет. Можно и такую фигню обработать, но лень. Удачи.
Код: plaintext
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.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"  xmlns:msxsl="urn:schemas-microsoft-com:xslt">
	<xsl:output encoding="windows-1251" indent="yes" method="html" />
	
	<xsl:template match="/">
		<html>
		<body>
			<xsl:variable name="_fragment">
				<xsl:call-template name="sax-emu">
					<xsl:with-param name="str" select="tag/xml" />
				</xsl:call-template>
			</xsl:variable>

			<xsl:variable name="fragment" select="msxsl:node-set($_fragment)" />
			<plaintext>
				<xsl:copy-of select="$fragment" />
				<xsl:value-of disable-output-escaping="yes" select="$fragment" />

				<xsl:value-of select="count($fragment//oper)" />
			</plaintext>
		</body>
		</html>
	</xsl:template>
	<xsl:template match="text()">
		<xsl:value-of disable-output-escaping="yes" select="." />
	</xsl:template>

<xsl:variable name="lt" select="'&lt;'" />
<xsl:variable name="gt" select="'&gt;'" />
<xsl:variable name="equot" select="'=&quot;'" />
<xsl:variable name="quot" select="'&quot;'" />
<xsl:template name="sax-emu">
	<xsl:param name="str" />

	<xsl:choose>
		<xsl:when test="contains( $str, '<' )">
			<xsl:value-of disable-output-escaping="yes" select="substring-before( $str, $lt )" />
			<xsl:choose>
				<xsl:when test="contains( $str, $gt )">
					<xsl:variable name="weak-tag" select="substring-before( substring-after( $str, $lt ), $gt )" />
					<xsl:variable name="has-attr" select="contains( $weak-tag, ' ')" />
					<xsl:variable name="simple-tag" select="substring( $weak-tag, string-length( $weak-tag )) = '/'" />
					<xsl:variable name="tag-name">
						<xsl:choose>
							<xsl:when test="$has-attr">
								<xsl:value-of select="substring-before( $weak-tag, ' ' )" />
							</xsl:when>
							<xsl:otherwise>
								<xsl:value-of select="$weak-tag" />
							</xsl:otherwise>
						</xsl:choose>
					</xsl:variable>
					<xsl:element name="{$tag-name}">
						<xsl:if test="$has-attr">
							<xsl:call-template name="build-attr">
								<xsl:with-param name="str" select="substring-after( $weak-tag, concat( $tag-name, ' ' ))" />
							</xsl:call-template>
						</xsl:if>
						<xsl:if test="not( $simple-tag )">
							<xsl:call-template name="sax-emu">
								<xsl:with-param name="str" select="substring-before( substring-after( $str, concat( $lt, $weak-tag, $gt )), concat( $lt, '/', $tag-name, $gt ))" />
							</xsl:call-template>
						</xsl:if>
					</xsl:element>
					<xsl:variable name="end-of-tag">
						<xsl:choose>
							<xsl:when test="$simple-tag">
								<xsl:value-of select="concat( $lt, $weak-tag, $gt )" />
							</xsl:when>
							<xsl:otherwise>
								<xsl:value-of select="concat( $lt, '/', $tag-name, $gt )" />
							</xsl:otherwise>
						</xsl:choose>
					</xsl:variable>
					<xsl:call-template name="sax-emu">
						<xsl:with-param name="str" select="substring-after( $str, $end-of-tag )" />
					</xsl:call-template>
				</xsl:when>
				<xsl:otherwise>
					<!-- tag error -->
				</xsl:otherwise>
			</xsl:choose>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of disable-output-escaping="yes" select="$str" />
		</xsl:otherwise>
	</xsl:choose>
</xsl:template>
<xsl:template name="build-attr">
	<xsl:param name="str" />

	<xsl:if test="contains( $str, $equot )">
		<xsl:if test="contains( substring-after( $str, $equot ), $quot )">
			<xsl:variable name="attr-name" select="substring-before( $str, $equot )" />
			<xsl:variable name="attr-value" select="substring-before( substring-after( $str, $equot ), $quot )" />
			<xsl:attribute name="{$attr-name}">
				<xsl:value-of select="$attr-value" />
			</xsl:attribute>
			<xsl:call-template name="build-attr">
				<xsl:with-param name="str" select="substring-after( $str, concat( $attr-name, $equot, $attr-value, $quot, ' ' ))" />
			</xsl:call-template>
		</xsl:if>
		<!-- else: attr-error -->
	</xsl:if>
	<!-- else: attr-error -->
</xsl:template>
</xsl:stylesheet>
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xml из текста
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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