Задать вопрос
eliasum
@eliasum
cd ..

Как преобразовать xml?

Входной файл xml:
<Item key="">
  <Adress>
	<Template key="01,07-10,21">
	  <Channel>
		<Template key="1-5"/>
	  </Channel>
	</Template>
  </Adress>
</Item>


Написал файл стилей:
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  
	<xsl:template match="@*|node()">
		<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
		</xsl:copy>
	</xsl:template>
	
	<xsl:template match="Template">
		<Item>
			<xsl:apply-templates select="@*|node()"/>
		</Item>
	</xsl:template>

</xsl:stylesheet>


Выходной xml файл выглядит так:
<Item key="">
  <Adress>
	<Item key="01,07-10,21">
	  <Channel>
		<Item key="1-5" />
	  </Channel>
	</Item>
  </Adress>
</Item>


Как доработать файл стилей, чтобы на выходе было:
<Item key="">
  <Adress>
	<Item key="01">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>
	<Item key="07">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>
	<Item key="08">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>
	<Item key="09">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>	
	<Item key="10">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>
	<Item key="21">
	  <Channel>
		<Item key="1"/>
		<Item key="2"/>
		<Item key="3"/>
		<Item key="4"/>
		<Item key="5"/>
	  </Channel>
	</Item>
  </Adress>
</Item>
  • Вопрос задан
  • 104 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
roswell
@roswell
и швец, и жнец, и на дуде игрец
Одним только XSLT здесь не обойтись (можно, впрочем, только усилия не будут стоить результата). Проще будет взять какой-нибудь скриптовый язык с поддержкой XSLT, и накрутить на нём парсер Template/@key и генератор XML по заданным условиям. Будет гораздо быстрей, чем разбирать строки по токенам.
Ответ написан
Комментировать
@ktwice
<xsl:function name="numseq">
    <xsl:param name="ranges"/>
    <xsl:sequence select="
for $xrange in tokenize($ranges,',') return
let $x:=tokenize($xrange,'-') return
if(empty($x[2]))then $xrange else
for $xnum in (number($x[1]) to number($x[2])) return
format-number($xnum,$x[1])
    "/>
</xsl:function>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы