XSLT output formatting with marc default namespace

This is a minor cosmetic thing, I’m just curious what’s going on under the water. I’m converting MARC21 XML to some other XML dialext using Saxonica transform.exe.

Here’s a short sample of my output. The question is: how come OCLC_number has tags and content each on a separate line (with the closing tag backtabbed), whereas all the others have tags and contents all on one line? The latter looks better to me, but I know it’s just a cosmetic thing.

    <?xml version="1.0" encoding="UTF-8"?>
    <AdlibXML xmlns:marc="http://www.loc.gov/MARC21/slim">
         <record>
                <OCLC_number>
                776125014
            </OCLC_number>
                <author>Lippmann, Harry.</author>
                <title>Deutsches Atlantik Wall Archiv : Register ... / Harry Lippmann.</title>
                <place_of_publication>Köln :</place_of_publication>
         </record>
    </AdlibXML>
    

Here’s a sample input XML. In real life, it’s a much larger export from WorldCat.

    <collection>
        <record xmlns="http://www.loc.gov/MARC21/slim">
            <datafield tag="034" ind1=" " ind2=" ">
                <subfield code="a">(OCoLC)776125014</subfield>
            </datafield>
            <datafield tag="100" ind1="1" ind2=" ">
                <subfield code="a">Lippmann, Harry.</subfield>
            </datafield>
            <datafield tag="245" ind1="1" ind2="0">
                <subfield code="a">Deutsches Atlantik Wall Archiv :</subfield>
                <subfield code="b">Register ... /</subfield>
                <subfield code="c">Harry Lippmann.</subfield>
            </datafield>  
            <datafield tag="260" ind1=" " ind2=" ">
                <subfield code="a">Köln :</subfield>
                <subfield code="b">Lippmann,</subfield>
                <subfield code="c">1996-....</subfield>
            </datafield>
        </record>
    </collection>
    

Here’s a short version of my XSLT.

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" 
        xmlns:marc="http://www.loc.gov/MARC21/slim" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        >
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="collection">
    <AdlibXML>
        <xsl:apply-templates select="marc:record" />
    </AdlibXML>
    </xsl:template>

    <xsl:template match="marc:record">
        <!-- OCLC-number must not be empty -->
        <xsl:if test="marc:datafield[@tag=034] !=''" >
            <record>

                <OCLC_number>
                    <xsl:value-of select="translate(marc:datafield[@tag=034], '(OCoLC)', '')" />
                </OCLC_number>
                
                <author>
                    <xsl:value-of select="marc:datafield[@tag=100]/marc:subfield[@code='a']" />
                </author>

                <title>
                    <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='a']" />
                    <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='b'] != ''" >
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='b']" /> 
                    </xsl:if>
                    <xsl:if test="marc:datafield[@tag=245]/marc:subfield[@code='c'] !=''" >
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="marc:datafield[@tag=245]/marc:subfield[@code='c']" />
                    </xsl:if>
                </title>

                <place_of_publication>
                    <xsl:value-of select="marc:datafield[@tag=260]/marc:subfield[@code='a']" />
                </place_of_publication>

            </record>  
        </xsl:if>
    </xsl:template>
    </xsl:stylesheet>       

The XSLT works. I learned about default namespaces in the process of making it. In fact, I learned I had to use xmlns:marc="http://www.loc.gov/MARC21/slim&quot;. But while MARC21 itself is fully documented, I couldn’t find any documentation about what this specific namespace is supposed to do or define.

>Solution :

You need to select the subfield select="translate(marc:datafield[@tag=034]/marc:subfield" or use <xsl:strip-space elements="*"/>.

Leave a Reply