Remove-Default-Attributes.xslt

From TEIWiki
Revision as of 20:43, 20 March 2006 by Mucherla srinivas (talk | contribs) (Known Restrictions or Problems)
Jump to navigation Jump to search

Summary

This is a straightforward XSLT stylesheet for removing the default attributes from a TEI document. These are often provided by the DTD or schema, and can clutter up viewing of them.

Add any comments to the 'discussion' tab.

Required Input

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE EtfDocumentaryCreditNotification SYSTEM "EtfDocumentaryCreditNotification466_1_0.dtd"> <EtfDocumentaryCreditNotification> <BaseHeader> <messageType>CHAETFData_1</messageType> <messageTypeVersion> <major>0001</major> <minor>0000</minor> </messageTypeVersion> <baseHeaderVersion> <major>0002</major> <minor>0001</minor> </baseHeaderVersion> <originalMessageID_B/> <wireFormat>XML</wireFormat> <senderID>GTF</senderID> <clientBez/> <isaccID>SB01</isaccID> <traceLevel/> <originalSendTime/> <patternType>DSY</patternType> <errorCode/> <severity/> <errorText/> <completionCode/> <reasonCode/> <mqObject/> <flowNode/> </BaseHeader> <AppHeader> <eventDomain>CHA</eventDomain> <eventCategory>ONL</eventCategory> <businessUnit>0009</businessUnit> <businessDay>ref01</businessDay> <eventTimestamp>2002-04-18-09.28.04.287551</eventTimestamp> </AppHeader> <EtfHeader> <cifNumber>083503619132</cifNumber> <tfsc>ZRH</tfsc> <orgUnit>SGAT 115</orgUnit> <dossierNumber>SGAT 115-054146</dossierNumber> <refNumber>SGAT 115-054146</refNumber> <eventId>ISS</eventId> <eventSeqNumber>0</eventSeqNumber> <msgSeqNumber>1</msgSeqNumber> <product>01</product> <timestamp>2006-03-17 11:45:28</timestamp> <entityId>001</entityId> <channel>B</channel> <numberOfElements>0</numberOfElements> <ProcessInformationCustomer> <subject>SGAT-115-054146_2006-03-17_466</subject> <line/> </ProcessInformationCustomer> </EtfHeader> <DocumentaryCreditNotification xmlns:dt=" http://www.bolero.net/io/xmlns/datatype/1.0"> <Header xmlns:cmp=" http://www.bolero.net/io/xmlns/header/1.0"> <cmp:DocumentID> <cmp:RID>CREDIT-SUISSE-USERTEST.IMAP</cmp:RID> <cmp:GeneralID>SGAT-115-054146A0</cmp:GeneralID> <cmp:Version>V1.0</cmp:Version> </cmp:DocumentID> <cmp:DocType> <cmp:DocTypeCode>466</cmp:DocTypeCode> </cmp:DocType> <cmp:Status>Final</cmp:Status> </Header> <Body> <Party> <partyType>APP</partyType> <partyName>Glencore International AG</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083503619132</partyIdValue> </PartyId> <PartyAddress> <line>Glencore International AG</line> <line>Baarermattstrasse 3</line> <line>Postfach 777</line> <line>6341 Baar</line> </PartyAddress> <Contact> <contactType>TEL</contactType> <contactValue>(41)41-7092947</contactValue> </Contact> <Contact> <contactType>FAX</contactType> <contactValue>(41)41-7093000</contactValue> </Contact> </Party> <Party> <partyType>ADB</partyType> <partyName>Bangkok Bank Public Company</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083509920500</partyIdValue> </PartyId> <PartyAddress> <line>Bangkok Bank Public Company</line> <line>Limited</line> <line>333 Silom Road</line> <line>TH-Bangkok 10500</line> </PartyAddress> </Party> <Party> <partyType>BEN</partyType> <partyName>Eximp</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue/> </PartyId> <PartyAddress> <line>Eximp</line> <line>Mainstreet</line> <line>London</line> </PartyAddress> </Party> <Party> <partyType>ISB</partyType> <partyName>Credit Suisse</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083510483505</partyIdValue> </PartyId> <PartyAddress> <line>Credit Suisse</line> <line>Hauptsitz</line> <line>8070 Zuerich</line> </PartyAddress> </Party> <Date> <dateType>EXP</dateType> <dateValue>2006-06-30</dateValue> </Date> <Date> <dateType>ISS</dateType> <dateValue>2006-03-17</dateValue> </Date> <Reference> <referenceType>999</referenceType> <referenceValue>RS170306T50</referenceValue> <ReferenceSource> <partyType>APP</partyType> </ReferenceSource> </Reference> <Reference> <referenceType>466</referenceType> <referenceValue>SGAT 115-054146</referenceValue> <ReferenceSource> <partyType>ISB</partyType> </ReferenceSource> </Reference> <Location> <locationType>SHF</locationType> <LocationId> <locationName>Mombasa</locationName> </LocationId> </Location> <Location> <locationType>SHT</locationType> <LocationId> <locationName>Basel</locationName> </LocationId> </Location> <Location> <locationType>DEL</locationType> <LocationId> <locationName>Basel</locationName> </LocationId> </Location> <DocumentaryCreditNotificationParticulars> <documentaryCreditType>IRREVOCABLE</documentaryCreditType> <documentaryCreditSubType>NOR</documentaryCreditSubType> <DocumentaryCreditAmount> <amount>3000.00</amount> <currencyCode>CHF</currencyCode> </DocumentaryCreditAmount> <DocumentaryCreditAmountVariance> <documentaryCreditAmountVarianceType>NOT EXCEEDING</documentaryCreditAmountVarianceType> <PercentageVariance/> </DocumentaryCreditAmountVariance> <DocumentaryCreditAvailability> <DocumentaryCreditAvailableWith> <documentaryCreditAvailabilityParty>ISB</documentaryCreditAvailabilityParty> </DocumentaryCreditAvailableWith> <documentaryCreditAvailabilityType>BY PAYMENT</documentaryCreditAvailabilityType> </DocumentaryCreditAvailability> <DocumentaryCreditValidity> <documentaryCreditValidityParty>ISB</documentaryCreditValidityParty> </DocumentaryCreditValidity> <confirmationInstructionType>WITHOUT</confirmationInstructionType> <PresentationPeriod> <line>2 weeks</line> </PresentationPeriod> <ShipmentPeriod> <line>One week</line> </ShipmentPeriod> <PartialShipment> <partialShipmentIndicator>FALSE</partialShipmentIndicator> </PartialShipment> <Transhipment> <transhipmentIndicator>FALSE</transhipmentIndicator> </Transhipment> <Incoterms> <incotermsCode>CIF</incotermsCode> </Incoterms> <documentIssueType>SWT</documentIssueType> <amendmentAdviceRefusalIndicator>FALSE</amendmentAdviceRefusalIndicator> </DocumentaryCreditNotificationParticulars> <Goods> <GoodsDescription> <line>coffee</line> </GoodsDescription> </Goods> <Documentation> <line>Invoice</line> </Documentation> </Body> </DocumentaryCreditNotification> </EtfDocumentaryCreditNotification>

Expected Output

Same document, but with default attributes removed if they have the default values.

Known Restrictions or Problems

<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE EtfDocumentaryCreditNotification SYSTEM "EtfDocumentaryCreditNotification466_1_0.dtd"> <EtfDocumentaryCreditNotification> <BaseHeader> <messageType>CHAETFData_1</messageType> <messageTypeVersion> <major>0001</major> <minor>0000</minor> </messageTypeVersion> <baseHeaderVersion> <major>0002</major> <minor>0001</minor> </baseHeaderVersion> <originalMessageID_B/> <wireFormat>XML</wireFormat> <senderID>GTF</senderID> <clientBez/> <isaccID>SB01</isaccID> <traceLevel/> <originalSendTime/> <patternType>DSY</patternType> <errorCode/> <severity/> <errorText/> <completionCode/> <reasonCode/> <mqObject/> <flowNode/> </BaseHeader> <AppHeader> <eventDomain>CHA</eventDomain> <eventCategory>ONL</eventCategory> <businessUnit>0009</businessUnit> <businessDay>ref01</businessDay> <eventTimestamp>2002-04-18-09.28.04.287551</eventTimestamp> </AppHeader> <EtfHeader> <cifNumber>083503619132</cifNumber> <tfsc>ZRH</tfsc> <orgUnit>SGAT 115</orgUnit> <dossierNumber>SGAT 115-054146</dossierNumber> <refNumber>SGAT 115-054146</refNumber> <eventId>ISS</eventId> <eventSeqNumber>0</eventSeqNumber> <msgSeqNumber>1</msgSeqNumber> <product>01</product> <timestamp>2006-03-17 11:45:28</timestamp> <entityId>001</entityId> <channel>B</channel> <numberOfElements>0</numberOfElements> <ProcessInformationCustomer> <subject>SGAT-115-054146_2006-03-17_466</subject> <line/> </ProcessInformationCustomer> </EtfHeader> <DocumentaryCreditNotification > <Header xmlns:cmp=" http://www.bolero.net/io/xmlns/header/1.0"> <cmp:DocumentID> <cmp:RID>CREDIT-SUISSE-USERTEST.IMAP</cmp:RID> <cmp:GeneralID>SGAT-115-054146A0</cmp:GeneralID> <cmp:Version>V1.0</cmp:Version> </cmp:DocumentID> <cmp:DocType> <cmp:DocTypeCode>466</cmp:DocTypeCode> </cmp:DocType> <cmp:Status>Final</cmp:Status> </Header> <Body> <Party> <partyType>APP</partyType> <partyName>Glencore International AG</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083503619132</partyIdValue> </PartyId> <PartyAddress> <line>Glencore International AG</line> <line>Baarermattstrasse 3</line> <line>Postfach 777</line> <line>6341 Baar</line> </PartyAddress> <Contact> <contactType>TEL</contactType> <contactValue>(41)41-7092947</contactValue> </Contact> <Contact> <contactType>FAX</contactType> <contactValue>(41)41-7093000</contactValue> </Contact> </Party> <Party> <partyType>ADB</partyType> <partyName>Bangkok Bank Public Company</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083509920500</partyIdValue> </PartyId> <PartyAddress> <line>Bangkok Bank Public Company</line> <line>Limited</line> <line>333 Silom Road</line> <line>TH-Bangkok 10500</line> </PartyAddress> </Party> <Party> <partyType>BEN</partyType> <partyName>Eximp</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue/> </PartyId> <PartyAddress> <line>Eximp</line> <line>Mainstreet</line> <line>London</line> </PartyAddress> </Party> <Party> <partyType>ISB</partyType> <partyName>Credit Suisse</partyName> <PartyId> <partyIdType>INT</partyIdType> <partyIdValue>083510483505</partyIdValue> </PartyId> <PartyAddress> <line>Credit Suisse</line> <line>Hauptsitz</line> <line>8070 Zuerich</line> </PartyAddress> </Party> <Date> <dateType>EXP</dateType> <dateValue>2006-06-30</dateValue> </Date> <Date> <dateType>ISS</dateType> <dateValue>2006-03-17</dateValue> </Date> <Reference> <referenceType>999</referenceType> <referenceValue>RS170306T50</referenceValue> <ReferenceSource> <partyType>APP</partyType> </ReferenceSource> </Reference> <Reference> <referenceType>466</referenceType> <referenceValue>SGAT 115-054146</referenceValue> <ReferenceSource> <partyType>ISB</partyType> </ReferenceSource> </Reference> <Location> <locationType>SHF</locationType> <LocationId> <locationName>Mombasa</locationName> </LocationId> </Location> <Location> <locationType>SHT</locationType> <LocationId> <locationName>Basel</locationName> </LocationId> </Location> <Location> <locationType>DEL</locationType> <LocationId> <locationName>Basel</locationName> </LocationId> </Location> <DocumentaryCreditNotificationParticulars> <documentaryCreditType>IRREVOCABLE</documentaryCreditType> <documentaryCreditSubType>NOR</documentaryCreditSubType> <DocumentaryCreditAmount> <amount>3000.00</amount> <currencyCode>CHF</currencyCode> </DocumentaryCreditAmount> <DocumentaryCreditAmountVariance> <documentaryCreditAmountVarianceType>NOT EXCEEDING</documentaryCreditAmountVarianceType> <PercentageVariance/> </DocumentaryCreditAmountVariance> <DocumentaryCreditAvailability> <DocumentaryCreditAvailableWith> <documentaryCreditAvailabilityParty>ISB</documentaryCreditAvailabilityParty> </DocumentaryCreditAvailableWith> <documentaryCreditAvailabilityType>BY PAYMENT</documentaryCreditAvailabilityType> </DocumentaryCreditAvailability> <DocumentaryCreditValidity> <documentaryCreditValidityParty>ISB</documentaryCreditValidityParty> </DocumentaryCreditValidity> <confirmationInstructionType>WITHOUT</confirmationInstructionType> <PresentationPeriod> <line>2 weeks</line> </PresentationPeriod> <ShipmentPeriod> <line>One week</line> </ShipmentPeriod> <PartialShipment> <partialShipmentIndicator>FALSE</partialShipmentIndicator> </PartialShipment> <Transhipment> <transhipmentIndicator>FALSE</transhipmentIndicator> </Transhipment> <Incoterms> <incotermsCode>CIF</incotermsCode> </Incoterms> <documentIssueType>SWT</documentIssueType> <amendmentAdviceRefusalIndicator>FALSE</amendmentAdviceRefusalIndicator> </DocumentaryCreditNotificationParticulars> <Goods> <GoodsDescription> <line>coffee</line> </GoodsDescription> </Goods> <Documentation> <line>Invoice</line> </Documentation> </Body> </DocumentaryCreditNotification> </EtfDocumentaryCreditNotification>

Stylesheet

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
  remove_default_attrs.xslt

  This style-sheet reads in an XML file (presumably a TEI
  Lite P4 XML one) and writes out the same file with
  any attributes that are specified with the same value as
  the default value (as listed in the 2004-07-16 version of
  teixlite.dtd) removed.

  I don't claim for a moment that the method I've used here is the best in
  any sense of the word "best", only that it was the one I happened to create
  using the flattened teixlite.dtd as a starting point.
  
  Written 2005-08-10 by Syd Bauman
  copyleft 2005 by Syd Bauman and the Text Encoding Initiative Consortium
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:tei="http://www.tei-c.org/ns/1.0">
  
  <xsl:output indent="yes" 
              method="xml"
              omit-xml-declaration="no"
              cdata-section-elements="eg"/>
  
  <!-- Generic copy-everything template -->
  <xsl:template match="*|@*|processing-instruction()|comment()">
    <xsl:copy>
      <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/>
    </xsl:copy>
  </xsl:template>   
  
  <!-- get rid of TEIform= attrs whose value match GI -->
  <!-- idea from Sebastian Rahtz's tei2tei.xsl -->
  <xsl:template match="@TEIform">        <!-- if we're on a TEIform= -->
    <xsl:if test="not( . = name(..) )">  <!-- if my value != name of the element I'm on -->
      <xsl:attribute name="TEIform">     <!-- output myself -->
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>                            <!-- thus, if my value == name of element I'm on, -->
  </xsl:template>                        <!-- since we do nothing the entire attr is dropped -->
  
  
  <!-- Now match each possible default, and reporoduce it only if  -->
  <!-- the value is not the default -->

  <!-- Each of these has precisely the same format, and thus it would -->
  <!-- probably be a good idea to make a separate parameterized routine -->
  <!-- instead. Someday. In the meantime, this is how they all work: -->
  <!-- When we hit an element/attribute combination that has a default value -->
  <!-- in the DTD, test to see if the value specified is the same as the -->
  <!-- default value in the DTD. If it is not, write out the attribute as -->
  <!-- it was specified in the instance; if it is, do nothing, thus dropping -->
  <!-- the entire attribute from the output. Note that the names of elements, -->
  <!-- attributes, and the attribute values are just hard-coded here in the -->
  <!-- style-sheet: no clever look-ups being performed here. -->
  
  <xsl:template match="gi/@TEI">
    <xsl:if test="not( . = 'yes' )">
      <xsl:attribute name="TEI">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="note/@anchored">
    <xsl:if test="not( . = 'yes' )">
      <xsl:attribute name="anchored">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="cell/@cols">
    <xsl:if test="not( . = '1' )">
      <xsl:attribute name="cols">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="textClass/@default | bibl/@default | biblFull/@default | editorialDecl/@default | langUsage/@default | listBibl/@default | projectDesc/@default | samplingDecl/@default | sourceDesc/@default">
    <xsl:if test="not( . = 'NO' )">
      <xsl:attribute name="default">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="q/@direct">
    <xsl:if test="not( . = 'unspecified' )">
      <xsl:attribute name="direct">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="refsDecl/@doctype">
    <xsl:if test="not( . = 'TEI.2' )">
      <xsl:attribute name="doctype">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="xref/@from | xptr/@from">
    <xsl:if test="not( . = 'ROOT' )">
      <xsl:attribute name="from">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="lg/@org | div0/@org | div1/@org | div2/@org | div3/@org | div4/@org | div5/@org | div6/@org | div7/@org | div/@org">
    <xsl:if test="not( . = 'uniform' )">
      <xsl:attribute name="org">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="seg/@part | ab/@part | div0/@part | div1/@part | div2/@part | div3/@part | div4/@part | div5/@part | div6/@part | div7/@part | div/@part | l/@part | lg/@part | s/@part">
    <xsl:if test="not( . = 'N' )">
      <xsl:attribute name="part">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="note/@place">
    <xsl:if test="not( . = 'unspecified' )">
      <xsl:attribute name="place">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="editor/@role">
    <xsl:if test="not( . = 'editor' )">
      <xsl:attribute name="role">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="cell/@role | row/@role">
    <xsl:if test="not( . = 'data' )">
      <xsl:attribute name="role">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="cell/@rows">
    <xsl:if test="not( . = '1' )">
      <xsl:attribute name="rows">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="lg/@sample | div0/@sample | div1/@sample | div2/@sample | div3/@sample | div4/@sample | div5/@sample | div6/@sample | div7/@sample | div/@sample">
    <xsl:if test="not( . = 'complete' )">
      <xsl:attribute name="sample">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="del/@statuss">
    <xsl:if test="not( . = 'unremarkable' )">
      <xsl:attribute name="status">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="availability/@status">
    <xsl:if test="not( . = 'unknown' )">
      <xsl:attribute name="status">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="teiHeader/@status">
    <xsl:if test="not( . = 'new' )">
      <xsl:attribute name="status">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="xref/@targOrder | ptr/@targOrder | ref/@targOrder | xptr/@targOrder">
    <xsl:if test="not( . = 'U' )">
      <xsl:attribute name="targOrder">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  
  <xsl:template match="xref/@to | xptr/@to">
    <xsl:if test="not( . = 'DITTO' )">
      <xsl:attribute name="to">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="titlePart/@type">
    <xsl:if test="not( . = 'main' )">
      <xsl:attribute name="type">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="list/@type">
    <xsl:if test="not( . = 'simple' )">
      <xsl:attribute name="type">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="teiHeader/@type">
    <xsl:if test="not( . = 'text' )">
      <xsl:attribute name="type">
        <xsl:value-of select="."/>
      </xsl:attribute>
    </xsl:if>
  </xsl:template>
  
</xsl:stylesheet>