Solved

Breaking XML into different nodes/sections

Posted on 2013-06-25
4
265 Views
Last Modified: 2013-06-26
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
0
Comment
Question by:lm1189
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 39275352
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
 
LVL 60

Accepted Solution

by:
Geert Bormans earned 500 total points
ID: 39275372
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
 

Author Comment

by:lm1189
ID: 39275721
Thank you!
0
 
LVL 60

Expert Comment

by:Geert Bormans
ID: 39277210
welcome
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
Create a Windows 10 custom Image with custom task bar and custom start menu using XML for deployment.
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…
How to Install VMware Tools in Red Hat Enterprise Linux 6.4 (RHEL 6.4) Step-by-Step Tutorial

751 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question