Гость
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xml-тег как текст / 6 сообщений из 6, страница 1 из 1
05.01.2011, 13:36
    #37046497
inooni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
Добрый день и с Новым Годом всех! Я уже вышел на работу и возник небольшой вопрос. имеется тег содержащий внутри другие теги и текст. мне нужно в помощью xslt-преобразовании записать в переменную этот тег как текст. как это сделать? функция string() возвращает только текст без самих тегов (в vs2010 проверяю)
...
Рейтинг: 0 / 0
05.01.2011, 14:55
    #37046569
inooni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
Возможно, не совсем понятно для чего это мне нужно. Поясню: использую java + xalan для работы с xsl. В процессе обработки стиля xslt у меня делаются вызовы методов из java, примерно такие:

Код: plaintext
1.
2.
3.
xmlns:analysis="xalan://org.someorg.controller.core.utils.xml.xslt.XsltAnalysis"
...
<xsl:value-of select="analysis:doSomething($someVariable)"/>
где вызывается однопараметрический метод doSomething класса XsltAnalysis в который передается значение из переменной $someVariable. Мне понадобилось передать в этот метод не просто текстовое значение, а целую структуру тегов в виде текста. Если я в эту переменную кладу переменную, содержащую nodeset, то из-за того, что в сигнатуре метода параметр строка, то, как я подозреваю xalan передает в метод value-of от этой переменной, который содержит только текст, без тегов. copy-of в правильном виде сохраняет в выходном xml текст, но это происходит уже в результате, а мне нужно получить результат работы copy-of, только в процессе обработки xml в переменную.
...
Рейтинг: 0 / 0
05.01.2011, 15:00
    #37046575
inooni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
и еще, я понимаю, что есть и другие пути решения моей проблемы: можно получить кусок xml до или после обработки отдельно (например обработать с помощью стандартного xmldom, найти все нужные элементы и вызвать у них toXML()) и делать с ним что угодно, но хотелось бы узнать: возможно ли вообще в процессе обработки xslt получить содержимое тега (вместе с вложенными тегами и текстом, "как они есть" в исходном документе) в виде строки.
...
Рейтинг: 0 / 0
05.01.2011, 16:18
    #37046678
refreg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
inooni,
Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:template match="/">
		<xsl:variable name="q">
			<xsl:call-template name="subnode">
				<xsl:with-param name="sn" select="/root"/>
			</xsl:call-template>
		</xsl:variable>
		<xsl:value-of select="$q" disable-output-escaping="yes"/>
	</xsl:template>
	<!-- -->
	<xsl:template name="subnode">
		<xsl:param name="sn"/>
		<xsl:for-each select="$sn">
			<xsl:value-of select="concat('&lt;',name(),'&gt;')"/>
			<xsl:call-template name="subnode">
				<xsl:with-param name="sn" select="./*"/>
			</xsl:call-template>
			<xsl:value-of select="./text()"/>
			<xsl:value-of select="concat('&lt;/',name(),'&gt;')"/>
		</xsl:for-each>
	</xsl:template>
</xsl:stylesheet>
Если нужны атрибуты, пространства имен, то надо допилить...
...
Рейтинг: 0 / 0
06.01.2011, 10:29
    #37047244
inooni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
refreginooni,
Как-то так:
Код: plaintext
...
Если нужны атрибуты, пространства имен, то надо допилить...

Спасибо большое, действительно интересный способ. Я его немного доработал:
Код: 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.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:gml="http://www.opengis.net/gml"
                version="1.0">
  <xsl:template match="/">
    <result>
      <xsl:for-each select="/root/gml:a">
        <xsl:variable name="q">
          <xsl:call-template name="getTagAsText">
            <xsl:with-param name="sn" select="."/>
          </xsl:call-template>
        </xsl:variable>
        <xsl:value-of select="$q" disable-output-escaping="yes"/>
        <xsl:element name="break">
          <xsl:value-of select="'========================='"/>
        </xsl:element>
      </xsl:for-each>
    </result>
  </xsl:template>

  <xsl:template name="getTagAsText">
    <xsl:param name="sn"/>
    <xsl:value-of select="concat('<',name($sn))"/>
    <xsl:for-each select="$sn/@*">
      <xsl:value-of select="concat(' ', name(), '="', . ,'"')"/>
    </xsl:for-each>
    <xsl:value-of select="'>'"/>
    <xsl:for-each select="$sn/*">
      <xsl:call-template name="getTagAsText">
        <xsl:with-param name="sn" select="."/>
      </xsl:call-template>
    </xsl:for-each>
    <xsl:value-of select="$sn/text()"/>
    <xsl:value-of select="concat('</',name($sn),'>')"/>
  </xsl:template>
</xsl:stylesheet>

успешно преобразует мою тестовую xml:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<?xml version='1.0' encoding="windows-1251" ?>
<root xmlns:gml="http://www.opengis.net/gml">
	<gml:a x="y" bbb="bbb">
		<gml:b hohoho="12321312"> 123 </gml:b>
		<c dfg="ddd"> 111 </c>
	</gml:a>
	<gml:a>
		<aads> 12312312 </aads>
	</gml:a>
</root>

в такую:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="utf-8"?>
<result xmlns:gml="http://www.opengis.net/gml">
  <gml:a x="y" bbb="bbb">
    <gml:b hohoho="12321312"> 123 </gml:b>
    <c dfg="ddd"> 111 </c>
  </gml:a>
  <break>=========================</break>
  <gml:a>
    <aads> 12312312 </aads>
  </gml:a>
  <break>=========================</break>
</result>
...
Рейтинг: 0 / 0
06.01.2011, 10:31
    #37047247
inooni
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
xml-тег как текст
немного неправильно выложилось: нужно <, > и " заменить на < > " в строках
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / xml-тег как текст / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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