Преобразуйте вложенные элементы XML с помощью xslt - PullRequest
2 голосов
/ 11 октября 2010

Как я могу преобразовать вложенные XML-элементы с помощью xslt, сохранив структуру?

Допустим, у меня есть XML-документ, подобный этому:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <node>
  </node>
  <node>
    <node>
      <node>
      </node>
    </node>
  </node>
</root>

И я хотел бы получить что-то вродеэто:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <element>
    </element>
    <element>
      <element>
        <element>
        </element>
      </element>
    </element>
</root>

Какой тип xslt мне следует использовать?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 11 октября 2010

Способ сделать это в XSLT заключается в следующем (используя правило идентификации и стиль push) :

<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()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="node">
  <element>
    <xsl:apply-templates select="node()|@*"/>
  </element>
 </xsl:template>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<root>
  <node>
  </node>
  <node>
    <node>
      <node>
      </node>
    </node>
  </node>
</root>

желаемый, правильный результат получается :

<root>
   <element/>
   <element>
      <element>
         <element/>
      </element>
   </element>
</root>

Примечание :

  1. Использование правила идентификации и его переопределения только для определенного элемента - это наиболее фундаментальный и мощный шаблон проектирования XSLT.

  2. Как с помощью 1. выше мы достигаем элегантного и чистого «толкающего» преобразования .

3 голосов
/ 11 октября 2010
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
    <root>
      <xsl:apply-templates />
    </root>
  </xsl:template>
  <xsl:template match="node">
    <element>
      <xsl:apply-templates />
    </element>
  </xsl:template>
</xsl:stylesheet>

Ключ - это тег apply-templates для рекурсивной обработки содержимого тега.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...