Breaking XML into different nodes/sections

Experts,

I have a XML and XSL I'm trying to format.  Currently its combining my "Detail" nodes together, so everywhere  it sees "Detail" it adds.  This is fine, but I want every detail I want it to spawn a new XML collection with the related tags under it like in target.xml I attached.  Any idea how I can have it break every detail section into its own collection while keeping header information in there?

Below is my XSLT:

<!-- Begin XST Style Sheet -->


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" >

<!-- Indent in the output -->
<xsl:output indent="yes"/>

<!-- Match the root -->
<xsl:template match="ProcessImage">
<Import> <!-- Insert our Import Node -->
<Archive ConnectionID="1" Name="1"> <!-- Define our Application Connection String -->
<Document pass="True"> <!-- Statically set documents to pass -->
<xsl:for-each select="Pages/Page"> <!-- Ignore -->
<DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
</xsl:for-each>
<Fields> <!-- Grab the field data and house it under the Fields Node -->
<xsl:for-each select="DataArea/Image/Header/*[not(self::Count)]"> <!-- Ignore Count if Present -->
<Field Name="{name(.)}" value="{./text()}" pass="True"/>
</xsl:for-each>
<xsl:for-each select="DataArea/Image/Detail/*[not(self::ImageData)]"> <!-- Ignore Image Data if Present -->
<Field Name="{name(.)}" value="{./text()}" pass="True"/>
</xsl:for-each>
</Fields>
</Document>
</Archive>
</Import>
</xsl:template>


</xsl:stylesheet>

Open in new window

target.xml
sample.xml
whatitsdoingnow.xml
lm1189Asked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
Geert BormansConnect With a Mentor Information ArchitectCommented:
However, it seems you want the Header repeated

<!-- Begin XST Style Sheet -->


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" >
  
  <!-- Indent in the output -->
  <xsl:output indent="yes"/>
  
  <!-- Match the root -->
  <xsl:template match="ProcessImage">
    <Import> <!-- Insert our Import Node -->
      <Archive ConnectionID="1" Name="1"> <!-- Define our Application Connection String -->
        <Document pass="True"> <!-- Statically set documents to pass -->
          <xsl:for-each select="Pages/Page"> <!-- Ignore -->
            <DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
          </xsl:for-each>
          <xsl:apply-templates select="DataArea/Image/Detail"/>
        </Document>
      </Archive>
    </Import>
  </xsl:template>
  
  <xsl:template match="Detail">
    <DocFile FileLoc="C:\SHARE FOLDER\SCANNED FILES\Scan{format-number(position() - 1, '0000')}.tif" /> <!-- Ignore -->
    <Fields>
      <xsl:apply-templates select="parent::Image/Header/*[not(self::Count)]"/> <!-- Ignore Count if Present -->
      <xsl:apply-templates select="*[not(self::ImageData)]"/> <!-- Ignore Image Data if Present -->
    </Fields>
  </xsl:template>
  
  <xsl:template match="Header/* | Detail/*">
    <Field Name="{name()}" value="{.}" pass="True"/>
  </xsl:template>
  
  
</xsl:stylesheet>

Open in new window

0
 
Geert BormansInformation ArchitectCommented:
Something like this?

Note that it is now that breaking up the templates as I showed you before really helps keeping teh code readable

<!-- Begin XST Style Sheet -->


<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:saxon="http://saxon.sf.net/" >
  
  <!-- Indent in the output -->
  <xsl:output indent="yes"/>
  
  <!-- Match the root -->
  <xsl:template match="ProcessImage">
    <Import> <!-- Insert our Import Node -->
      <Archive ConnectionID="1" Name="1"> <!-- Define our Application Connection String -->
        <Document pass="True"> <!-- Statically set documents to pass -->
          <xsl:for-each select="Pages/Page"> <!-- Ignore -->
            <DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
          </xsl:for-each>
          <xsl:apply-templates select="DataArea/Image/Header | DataArea/Image/Detail"/>
        </Document>
      </Archive>
    </Import>
  </xsl:template>
  
  <xsl:template match="Header">
    <DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
    <Fields>
      <xsl:apply-templates select="*[not(self::Count)]"/> <!-- Ignore Count if Present -->
    </Fields>
  </xsl:template>
  
  <xsl:template match="Detail">
    <DocFile FileLoc="{@FileName}" /> <!-- Ignore -->
    <Fields>
      <xsl:apply-templates select="*[not(self::ImageData)]"/> <!-- Ignore Image Data if Present -->
    </Fields>
  </xsl:template>
  
  <xsl:template match="Header/* | Detail/*">
    <Field Name="{name()}" value="{.}" pass="True"/>
  </xsl:template>
  
  
</xsl:stylesheet>

Open in new window

0
 
lm1189Author Commented:
Thank you!
0
 
Geert BormansInformation ArchitectCommented:
welcome
0
All Courses

From novice to tech pro — start learning today.