Initial dev repository
[kcls-web.git] / opac / extras / xsl / locDoc2xml.xsl
diff --git a/opac/extras/xsl/locDoc2xml.xsl b/opac/extras/xsl/locDoc2xml.xsl
new file mode 100644 (file)
index 0000000..596fef1
--- /dev/null
@@ -0,0 +1,180 @@
+<!--
+
+Copyright (C) 2008 Equinox Software, Inc.
+Mike Rylander <miker@esilibrary.com>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
+
+-->
+
+
+<!--
+
+This XSLT will take the MARC21 Concise Format for Bibliographic Data
+documentation maintained by the Library of Congress and turn it into an XML
+document for use by Evergreen (and others, if you so desire, under the terms
+of the GPL).  The LoC docs are available from:
+
+ http://www.loc.gov/marc/bibliographic/
+
+The format of the output XML is similar to that produced sometime during
+2005 by Ed Summers and shared at textualize.com.  That site was not available
+at the time of this XSLT's creation, and thus this exists.
+
+Please report any problems to Mike Rylander at <miker@esilibrary.com>.
+
+Here's an easy way to use this:
+
+curl -o - http://www.loc.gov/marc/bibliographic/ecbd{ldrd,cntr,007s,008s,numb,clas,main,tils,impr,phys,sers,not1,not2,subj,adde,link,srae,hold}.html | \
+ tidy -asxml -n -q -utf8 | \
+ xsltproc -\-html -\-novalid locDoc2xml.xsl - | \
+ xmllint -\-format -\-noblanks - > marcedit-tooltips.xml
+
+-->
+
+
+<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:output omit-xml-declaration="yes" method="xml" encoding="UTF-8" media-type="text/plain" />
+
+    <xsl:template match="/">
+    <fields>
+        <xsl:for-each select="//a[substring(@href,1,5)='#mrcb']">
+            <xsl:call-template name="field">
+                <xsl:with-param name="datafieldLabel" select="substring-after(@href,'#')"/>
+            </xsl:call-template>
+        </xsl:for-each>
+    </fields>
+    </xsl:template>
+
+    <xsl:template name="field">
+        <xsl:param name="datafieldLabel"/>
+        <xsl:variable name="locatorAnchor" select="//a[@name=$datafieldLabel]"/>
+
+        <xsl:variable name="tagValue" select="substring-before($locatorAnchor, ' - ')"/>
+        <xsl:if test="$tagValue != ''">
+
+            <xsl:variable name="nameStart" select="substring-after($locatorAnchor, ' - ')"/>
+
+            <xsl:variable name="nameValue" select="substring-before($nameStart, '(')"/>
+
+            <xsl:variable name="repeatable" select="substring-after($nameStart, '(')"/>
+            <xsl:variable name="description" select="$locatorAnchor/parent::node()/following-sibling::node()/descendant-or-self::*"/>
+
+            <field>
+                <xsl:attribute name="tag">
+                    <xsl:value-of select="$tagValue"/>
+                </xsl:attribute>
+                <xsl:attribute name="repeatable">
+                    <xsl:choose>
+                        <xsl:when test="substring($repeatable,1,1)='R'">
+                            <xsl:text>true</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>false</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+
+                <name>
+                    <xsl:value-of select="normalize-space($nameValue)"/>
+                </name>
+
+                <description>
+                    <xsl:value-of select="normalize-space($description)"/>
+                </description>
+
+                <xsl:call-template name="indicators">
+                    <xsl:with-param name="indUL" select="$locatorAnchor/parent::node()/following-sibling::h3[.='Indicators'][1]/following-sibling::ul[1]"/>
+                </xsl:call-template>
+
+                <xsl:if test="substring($tagValue,1,2) != '00'">
+                    <xsl:call-template name="subfields">
+                        <xsl:with-param name="sfUL" select="$locatorAnchor/parent::node()/following-sibling::h3[.='Subfield Codes'][1]/following-sibling::ul[1]"/>
+                    </xsl:call-template>
+                </xsl:if>
+
+            </field>
+
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template name="indicators">
+        <xsl:param name="indUL"/>
+        <xsl:for-each select="$indUL/li">
+            <xsl:if test="string-length(substring-after(.,' - Undefi')) = 0">
+
+                <xsl:variable name="indPos">
+                    <xsl:choose>
+                        <xsl:when test="starts-with(.,'First')">
+                            <xsl:text>1</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>2</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:variable>
+
+                <xsl:for-each select="./ul/li">
+                    <indicator>
+                        <xsl:attribute name="position">
+                            <xsl:value-of select="$indPos"/>
+                        </xsl:attribute>
+
+                        <xsl:attribute name="value">
+                            <xsl:value-of select="substring-before(.,' - ')"/>
+                        </xsl:attribute>
+
+                        <description>
+                            <xsl:value-of select="normalize-space(substring-after(.,' - '))"/>
+                        </description>
+                    </indicator>
+                </xsl:for-each>
+            </xsl:if>
+        </xsl:for-each>
+    </xsl:template>
+
+    <xsl:template name="subfields">
+        <xsl:param name="sfUL"/>
+        <xsl:for-each select="$sfUL/li">
+            <xsl:variable name="sfCode" select="substring-before(., ' - ')"/>
+            <xsl:variable name="descStart" select="substring-after(., ' - ')"/>
+            <xsl:variable name="descValue" select="substring-before($descStart, '(')"/>
+            <xsl:variable name="sfRepeatable" select="substring-after(., '(')"/>
+
+            <subfield>
+                <xsl:attribute name="code">
+                    <xsl:value-of select="substring($sfCode,2,1)"/>
+                </xsl:attribute>
+
+                <xsl:attribute name="repeatable">
+                    <xsl:choose>
+                        <xsl:when test="substring($sfRepeatable,1,1)='R'">
+                            <xsl:text>true</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>false</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+
+                <description>
+                    <xsl:value-of select="normalize-space($descValue)"/>
+                </description>
+            </subfield>
+        </xsl:for-each>
+    </xsl:template>
+
+</xsl:stylesheet>
+