xsl-list
[Top] [All Lists]

RE: [xsl] RE: Blank lines in transformed XML

2007-11-07 10:08:38
A few observations:
- Try removing
xmlns="http://xml.dod.mil/log/maint/fs/reportResponse/1.0.0"; from the
top of your stylesheet. I'm not sure where it's being used, but it just
begs for unexpected behavior.
- Where have you tried using <xsl:strip-space elements="*"/>? I don't
see it in your stylesheet below; try inserting it right below
<xsl:output/>.
- I've had some issues with whitespace before while using libxslt, but I
thought they went away as soon as I used <strip-space/>. If you'd like
to test that explicitly, try inserting this template at the bottom of
your stylesheet (it should handle any cases that <strip-space/>
doesn't):
  <xsl:template match="text()[not(normalize-space())]"/>

~ Scott


-----Original Message-----
From: Thomas Jackie R Ctr HQ 754 ELSG/LRM
[mailto:Jackie(_dot_)Thomas(_dot_)Ctr(_at_)Gunter(_dot_)Af(_dot_)Mil] 
Sent: Wednesday, November 07, 2007 10:42 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] RE: Blank lines in transformed XML

Let me give a specific example of the problem we are having at the
bottom of the original message.  We've tried using xsl:strip-space but
with no luck.  

We are transforming xml being output by a program into xml to match our
xml schema.  We basically copy the original xml in the following way: 
<xsl:template match="/"><xsl:apply-templates /></xsl:template> and/or
<xsl:template match="*"><xsl:copy><xsl:apply-templates
/></xsl:copy></xsl:template> and then we maniputlate the xml where
needed. In doing so we rename tags, manipulate tag contents and omit
tags altogether.  The way we are omitting tags is with a blank template
match.  For example <xsl:template match="title"/> is our way of omitting
any <title> tags from our transformed xml.  The problem is, the
transformed xml now has blank lines anywhere a <title> tag would have
appeared.  

How do we remove the blank lines from the transformed xml.  We are using
xml/xslt 1.0 and the xerces parser.  Thanks for any help.

Here's a very simple example:
Input XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="../fs/fs0ginxslt1.xslt" type="text/xsl" ?>
<gin elc="7494" remote_id="ACB" txn_dt_tm="07296/2002" program_id="GI"
version_date="101107" unit_id="A">
        <ReportTitle>A2010
- Actual Configuration</ReportTitle>
        <TypeOutput>2</TypeOutput>
        <ReportOptions>Current Operating Time (Including Engine
Parts)</ReportOptions>
        <EquipmentId>A2010</EquipmentId>
        <ActualConfiguration>
                <UnitId>A</UnitId>
                <EquipmentId>A2010</EquipmentId>
                <EquipmentDesignator>F015C</EquipmentDesignator>
                <OperatingTime>6706.8</OperatingTime>
                <ActualConfigurationRow>
        
<DetailDataRecordSequenceNumber>1</DetailDataRecordSequenceNumber>
                        <UnitId>A</UnitId>
                        <PartNumber>A2010</PartNumber>
                        <LevelOfIndenture>01</LevelOfIndenture>
        
<CurrentOperatingTime>6706.8</CurrentOperatingTime>
        
<MaintenanceTypeInterval>H</MaintenanceTypeInterval>
                        <TypeEquipment>M</TypeEquipment>
                        <NextHigherAssemblyDataRow>
                        </NextHigherAssemblyDataRow>
                        <InstalledDateDataRow>
                        </InstalledDateDataRow>
        
<PreviousOperatingTime>0.0</PreviousOperatingTime>
                </ActualConfigurationRow>
                <ActualConfigurationRow>
        
<DetailDataRecordSequenceNumber>2</DetailDataRecordSequenceNumber>
                        <UnitId>A</UnitId>
                        <PartNumber>E0584</PartNumber>
                        <SerialNumber>PW0E680584</SerialNumber>
                        <InstalledPosition>0002</InstalledPosition>
                        <LevelOfIndenture>02</LevelOfIndenture>
                        <WorkUnitCode>23Z00</WorkUnitCode>
                        <WorkUnitCodeNarrative>TURBOFAN PWR
PLANT</WorkUnitCodeNarrative>
                        <CurrentOperatingTime>N/A</CurrentOperatingTime>
        
<MaintenanceTypeInterval>7</MaintenanceTypeInterval>
                        <TypeEquipment>E</TypeEquipment>
                        <NextHigherAssemblyDataRow>
                                <PartNumber>A2010</PartNumber>
                                <TypeEquipment>M</TypeEquipment>
                        </NextHigherAssemblyDataRow>
                        <InstalledDateDataRow>
                                <Date>2005237</Date>
                        </InstalledDateDataRow>
                </ActualConfigurationRow>
        </ActualConfiguration>
</gin>

XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns="http://xml.dod.mil/log/maint/fs/reportResponse/1.0.0";>
        <xsl:output method="xml" version="1.0" encoding="UTF-8"
indent="no"/>
        <!-- Output Stylesheet Version 1.0.0 for Straightline
Transaction GIN created at Friday Aug 17 12:17:28 CDT 2007 -->

        <xsl:template match="/">
                <xsl:apply-templates/>
        </xsl:template>
        <xsl:template match="*">
                <xsl:copy>
                        <xsl:apply-templates/>
                </xsl:copy>
        </xsl:template>
        <xsl:template match="gin">
                <IMDSCDB
xmlns="http://xml.dod.mil/log/maint/fs/reportResponse/1.0.0";>
                        <CurrentOperatingTimeSummary>
                                <ReportInformation>
                                        <ReportTitle>
                                                <xsl:value-of
select="ReportTitle"/>
                                        </ReportTitle>
                                        <xsl:if test="ReportOptions">
                                                <ReportOptions>
                                                        <xsl:value-of
select="ReportOptions"/>
                                                </ReportOptions>
                                        </xsl:if>
                                        <ReportAsOfDate>
                                                <xsl:value-of
select="substring(@txn_dt_tm,1,5)"/>
                                                <xsl:text> </xsl:text>
                                                <xsl:value-of
select="substring(@txn_dt_tm,7,2)"/>:<xsl:value-of
select="substring(@txn_dt_tm,9,2)"/>:00</ReportAsOfDate>
                                        <CurrentEnterpriseLocationCode>
                                                <xsl:value-of
select="@elc"/>
                                        </CurrentEnterpriseLocationCode>
                                        <UnitId>
                                                <xsl:value-of
select="@unit_id"/>
                                        </UnitId>
                                </ReportInformation>
                                <xsl:apply-templates/>
                        </CurrentOperatingTimeSummary>
                </IMDSCDB>
        </xsl:template>
        <xsl:template match="ReportTitle"/>
        <xsl:template match="TypeOutput"/>
        <xsl:template match="ReportOptions"/>
        <xsl:template match="TypeEquipment"/>
        <xsl:template match="ElapsedTime"/>
        <xsl:template match="ActualConfigurationRow">
                <ActualConfigurationData>
                        <xsl:apply-templates/>
                </ActualConfigurationData>
        </xsl:template>
        <xsl:template match="ActualConfigurationRow/PartNumber">
                <xsl:choose>
                        <xsl:when test="../TypeEquipment='P'">
                                <PartNumber>
                                        <xsl:apply-templates/>
                                </PartNumber>
                        </xsl:when>
                        <xsl:otherwise>
                                <EquipmentId>
                                        <xsl:value-of select="."/>
                                </EquipmentId>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        <xsl:template match="ActualConfigurationRow/SerialNumber">
                <xsl:choose>
                        <xsl:when test="../TypeEquipment='P'">
                                <SerialNumber>
                                        <xsl:apply-templates/>
                                </SerialNumber>
                        </xsl:when>
                        <xsl:when test="../TypeEquipment='E'">
                                <ManufacturerCode>
                                        <xsl:value-of
select="substring(.,1,2)"/>
                                </ManufacturerCode>
                                <EngineSerialNumber>
                                        <xsl:value-of
select="substring(.,3,8)"/>
                                </EngineSerialNumber>
                        </xsl:when>
                </xsl:choose>
        </xsl:template>
        <xsl:template match="OperatingTime">
                <OperatingTime>
                        <xsl:attribute name="decimalPosition">
                                <xsl:choose>
                                        <xsl:when
test="contains(../OperatingTime,'.')">
                                                <xsl:value-of
select="string-length(substring-after(../OperatingTime, '.'))"/>
                                        </xsl:when>
                                        <xsl:otherwise>0</xsl:otherwise>
                                </xsl:choose>
                        </xsl:attribute>
                        <xsl:choose>
                                <xsl:when
test="contains(../OperatingTime,'.')">
                                        <xsl:value-of
select="normalize-space(substring-before(../OperatingTime,'.'))"/>
                                        <xsl:value-of
select="substring-after(../OperatingTime, '.')"/>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:value-of
select="normalize-space(../OperatingTime)"/>
                                </xsl:otherwise>
                        </xsl:choose>
                </OperatingTime>
        </xsl:template>
        <xsl:template match="DifferentialCode">
                <DifferentiationCode>
                        <xsl:value-of select="."/>
                </DifferentiationCode>
        </xsl:template>
        <xsl:template match="CageCode">
                <CommercialAndGovernmentEntityCode>
                        <xsl:value-of select="."/>
                </CommercialAndGovernmentEntityCode>
        </xsl:template>
        <xsl:template match="CurrentOperatingTime">
                <xsl:if test=".!='N/A'">
                        <OperatingTime>
                                <xsl:attribute name="decimalPosition">
                                        <xsl:choose>
                                                <xsl:when
test="contains(../CurrentOperatingTime,'.')">
                                                        <xsl:value-of
select="string-length(substring-after(../CurrentOperatingTime, '.'))"/>
                                                </xsl:when>
        
<xsl:otherwise>0</xsl:otherwise>
                                        </xsl:choose>
                                </xsl:attribute>
                                <xsl:choose>
                                        <xsl:when
test="contains(../CurrentOperatingTime,'.')">
                                                <xsl:value-of
select="normalize-space(substring-before(../CurrentOperatingTime,'.'))"/

                                                <xsl:value-of
select="substring-after(../CurrentOperatingTime, '.')"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:value-of
select="normalize-space(../CurrentOperatingTime)"/>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </OperatingTime>
                </xsl:if>
        </xsl:template>
        <xsl:template match="NextHigherAssemblyDataRow">
                <xsl:if test="*">
                        <NextHigherAssemblyData>
                                <xsl:apply-templates/>
                        </NextHigherAssemblyData>
                </xsl:if>
        </xsl:template>
        <xsl:template match="NextHigherAssemblyDataRow/PartNumber">
                <xsl:choose>
                        <xsl:when test="../TypeEquipment='P'">
                                <PartNumber>
                                        <xsl:apply-templates/>
                                </PartNumber>
                        </xsl:when>
                        <xsl:otherwise>
                                <EquipmentId>
                                        <xsl:value-of select="."/>
                                </EquipmentId>
                        </xsl:otherwise>
                </xsl:choose>
        </xsl:template>
        <xsl:template match="NextHigherAssemblyDataRow/SerialNumber">
                <xsl:choose>
                        <xsl:when test="../TypeEquipment='P'">
                                <SerialNumber>
                                        <xsl:apply-templates/>
                                </SerialNumber>
                        </xsl:when>
                        <xsl:when test="../TypeEquipment='E'">
                                <ManufacturerCode>
                                        <xsl:value-of
select="substring(.,1,2)"/>
                                </ManufacturerCode>
                                <EngineSerialNumber>
                                        <xsl:value-of
select="substring(.,3,8)"/>
                                </EngineSerialNumber>
                        </xsl:when>
                </xsl:choose>
        </xsl:template>
        <xsl:template match="InstalledDateDataRow">
                <xsl:if test="Date">
                        <InstallDate>
                                <xsl:attribute
name="dateFormat">CCYYDDD</xsl:attribute>
                                <xsl:value-of select="Date"/>
                        </InstallDate>
                </xsl:if>
                <xsl:if test="Time">
                        <InstalledAtOperatingTime>
                                <xsl:attribute name="decimalPosition">
                                        <xsl:choose>
                                                <xsl:when
test="contains(Time,'.')">
                                                        <xsl:value-of
select="string-length(substring-after(Time, '.'))"/>
                                                </xsl:when>
        
<xsl:otherwise>0</xsl:otherwise>
                                        </xsl:choose>
                                </xsl:attribute>
                                <xsl:choose>
                                        <xsl:when
test="contains(Time,'.')">
                                                <xsl:value-of
select="normalize-space(substring-before(Time,'.'))"/>
                                                <xsl:value-of
select="substring-after(Time, '.')"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:value-of
select="normalize-space(Time)"/>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </InstalledAtOperatingTime>
                </xsl:if>
        </xsl:template>
        <xsl:template match="PreviousOperatingTime">
                <PreviousOperatingTime>
                        <xsl:attribute name="decimalPosition">
                                <xsl:choose>
                                        <xsl:when
test="contains(../PreviousOperatingTime,'.')">
                                                <xsl:value-of
select="string-length(substring-after(../PreviousOperatingTime, '.'))"/>
                                        </xsl:when>
                                        <xsl:otherwise>0</xsl:otherwise>
                                </xsl:choose>
                        </xsl:attribute>
                        <xsl:choose>
                                <xsl:when
test="contains(../PreviousOperatingTime,'.')">
                                        <xsl:value-of
select="normalize-space(substring-before(../PreviousOperatingTime,'.'))"
/>
                                        <xsl:value-of
select="substring-after(../PreviousOperatingTime, '.')"/>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:value-of
select="normalize-space(../PreviousOperatingTime)"/>
                                </xsl:otherwise>
                        </xsl:choose>
                </PreviousOperatingTime>
        </xsl:template>
</xsl:transform>


Output XML (notice all the blank lines):
<?xml version="1.0" encoding="UTF-8"?>
<IMDSCDB xmlns="http://xml.dod.mil/log/maint/fs/reportResponse/1.0.0";>
        <CurrentOperatingTimeSummary>
                <ReportInformation>
                        <ReportTitle>A2010
- Actual Configuration</ReportTitle>
                        <ReportOptions>Current Operating Time (Including
Engine Parts)</ReportOptions>
                        <ReportAsOfDate>07296 20:02:00</ReportAsOfDate>
        
<CurrentEnterpriseLocationCode>7494</CurrentEnterpriseLocationCode>
                        <UnitId>A</UnitId>
                </ReportInformation>



                <EquipmentId>A2010</EquipmentId>
                <ActualConfiguration>
                        <UnitId>A</UnitId>
                        <EquipmentId>A2010</EquipmentId>
                        <EquipmentDesignator>F015C</EquipmentDesignator>
                        <OperatingTime
decimalPosition="1">67068</OperatingTime>
                        <ActualConfigurationData>
        
<DetailDataRecordSequenceNumber>1</DetailDataRecordSequenceNumber>
                                <UnitId>A</UnitId>
                                <EquipmentId>A2010</EquipmentId>
                                <LevelOfIndenture>01</LevelOfIndenture>
                                <OperatingTime
decimalPosition="1">67068</OperatingTime>
        
<MaintenanceTypeInterval>H</MaintenanceTypeInterval>



                                <PreviousOperatingTime
decimalPosition="1">00</PreviousOperatingTime>
                        </ActualConfigurationData>
                        <ActualConfigurationData>
        
<DetailDataRecordSequenceNumber>2</DetailDataRecordSequenceNumber>
                                <UnitId>A</UnitId>
                                <EquipmentId>E0584</EquipmentId>
                                <ManufacturerCode>PW</ManufacturerCode>
        
<EngineSerialNumber>0E680584</EngineSerialNumber>
        
<InstalledPosition>0002</InstalledPosition>
                                <LevelOfIndenture>02</LevelOfIndenture>
                                <WorkUnitCode>23Z00</WorkUnitCode>
                                <WorkUnitCodeNarrative>TURBOFAN PWR
PLANT</WorkUnitCodeNarrative>

        
<MaintenanceTypeInterval>7</MaintenanceTypeInterval>

                                <NextHigherAssemblyData>
                                        <EquipmentId>A2010</EquipmentId>
                                </NextHigherAssemblyData>
                                <InstallDate
dateFormat="CCYYDDD">2005237</InstallDate>
                        </ActualConfigurationData>
        </CurrentOperatingTimeSummary>
</IMDSCDB>




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>