XSLT Преобразование сомнений - PullRequest
1 голос
/ 03 октября 2010

Я хочу написать xslt для преобразования одного файла XML в другой.Исходный XML-файл похож на следующий

<orgs>
<organization revenue="10000">
  <name>foo</name>
</organization>
<organization parent="foo">
 <name>foo2</name>
</organization>
<organization parent="foo2">
 <name>foo3</name>
</organization>
</orgs>

Выходной XML должен быть следующим:

<orgo>
<organization revenue="10000">
 <name>foo</name>
 <organization>
  <name>foo2</name>
  <organization><name>foo3</name></organization>
 </organization>
</organization>
</orgo>

До сих пор я пытался написать xsl следующим образом xslt

1 Ответ

1 голос
/ 03 октября 2010

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

<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()[1]"/>
       <xsl:apply-templates select="following-sibling::node()[1]"/>
     </xsl:copy>
 </xsl:template>

</xsl:stylesheet>

при применении к предоставленному документу XML :

<orgs>
    <organization revenue="10000">
        <name>foo</name>
    </organization>
    <organization parent="foo">
        <name>foo2</name>
    </organization>
    <organization parent="foo2">
        <name>foo3</name>
    </organization>
</orgs>

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

<orgs>
   <organization>
      <name>foo</name>
      <organization>
         <name>foo2</name>
         <organization>
            <name>foo3</name>
         </organization>
      </organization>
   </organization>
</orgs>

В случае, если порядок элементов <organization> является случайным, как в следующем XML-документе :

<orgs>
    <organization parent="foo2">
        <name>foo3</name>
    </organization>
    <organization parent="foo">
        <name>foo2</name>
    </organization>
    <organization revenue="10000">
        <name>foo</name>
    </organization>
</orgs>

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

<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="/*">
     <xsl:copy>
       <xsl:apply-templates select="organization[not(@parent)]"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="organization">
     <xsl:copy>
       <xsl:copy-of select="node()"/>
       <xsl:apply-templates select="../organization[@parent=current()/name]"/>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...