Преобразование XML с помощью XSL

Я хочу передать файл XML в другой XML с помощью XSLT. Я хочу выполнить преобразование, потому что файл XML не является чистым документом с древовидной структурой.

Вот мой файл раньше:

<uglyStartTag></uglyStartTag>
    <name>content</name>
<uglyEndTag></uglyEndTag>

or

<uglyStartTag/>
    <name>content</name>
<uglyEndTag/>

Вот мой файл после:

<beautyTag>
    <name>content</name>
</beautyTag>

Как мне это сделать? Я не знаком с XSLT, поэтому буду благодарен за любые советы.


person bontade    schedule 05.08.2012    source источник
comment
Знаете ли вы, что у вас есть неправильно сформированный xml. Это может даже привести к тому, что xslt вообще не будет работать.   -  person Kai Mattern    schedule 05.08.2012
comment
XML file isn't pure tree-structured разве это не противоречит?   -  person Kowser    schedule 05.08.2012
comment
XML-файл правильно сформирован по стандарту XML, но для хранения одного типа данных у меня есть два тега: открывающий uglyStartTag и заканчивающий uglyEndTag. Должен быть один тег, например beautyTag   -  person bontade    schedule 05.08.2012
comment
@Kowser, как видите, данные никогда не хранятся внутри <uglyStartTag></uglyStartTag> или <uglyEndTag></uglyEndTag>. Нет никакой возможности, что, например, uglyStartTag будет храниться как: <uglyEndTag>**some data**</uglyEndTag>. Так что это не чистый стандарт с древовидной структурой   -  person bontade    schedule 05.08.2012
comment
дело в том, что первый пример не является допустимым XML.   -  person    schedule 05.08.2012


Ответы (1)


Это преобразование:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

     <xsl:template match=
      "node()[preceding-sibling::uglyStartTag
            and
              following-sibling::uglyEndTag
              ][1]">
      <beautyTag>
        <xsl:copy-of select=
         "../node()[preceding-sibling::uglyStartTag
                  and
                    following-sibling::uglyEndTag
                   ]
         "/>
      </beautyTag>
     </xsl:template>
</xsl:stylesheet>

при применении к этому XML-документу (предоставлено OP в комментарии):

<t>
    <uglyStartTag />
    <name>dgsdgsdgsdg</name>
    <uglyEndTag />
</t>

выдает желаемый правильный результат:

<beautyTag>
   <name>dgsdgsdgsdg</name>
</beautyTag>
person Dimitre Novatchev    schedule 05.08.2012
comment
Не могли бы вы сказать мне, что не так, когда я пытаюсь использовать XSLT с <t><uglyStartTag /> <name>dgsdgsdgsdg</name> <uglyEndTag /></t>. Выход <beautyTag>dgsdgsdgsdg</beautyTag>. Я хотел бы иметь <beautyTag><name>dgsdgsdgsdg</name></beautyTag> - person bontade; 05.08.2012
comment
@bontade, вы не указали такое требование в вопросе. контент - это просто строка. Пожалуйста, отредактируйте и обновите вопрос. Я скоро обновлю свой ответ. - person Dimitre Novatchev; 05.08.2012
comment
@bontade, я отредактировал этот ответ, и теперь он обрабатывает ваш новый XML-документ нужным образом. - person Dimitre Novatchev; 05.08.2012