XSLT to translate Zotero xml output to FMPXMLRESULT xml?

本秂侑毒 提交于 2020-01-03 03:23:25

问题


I need to get items from a Zotero database into FileMaker Pro. The most obvious way to do that is to export from Zotero into xml, translate that xml into the FMPXMLRESULT xml format, and then import into FileMaker Pro.

I'm a complete newbie to dealing with translating xml formats.

Does anybody have an xslt that will do that, or to provide me with some suggestions specific to these two xml formats (not just general xslt/xml references)?

The Zotero xml output is in the Library of Congress MODS form: http://www.loc.gov/standards/mods/.

The FileMaker Pro FMPXMLRESULT xml format is described here: http://www.filemaker.com/help/html/import_export.16.30.html.

Below is an example of the Zotero MODS export. (Sorry, some of the indenting got lost in copying the file to form a code block in this post. Here's a Dropbox link to the actual file: https://www.dropbox.com/s/otrwr7xk0uwmff7/From_Zotero_MODS.xml)

<?xml version="1.0"?>
<modsCollection xsi:schemaLocation="http://www.loc.gov/mods/v3     
http://www.loc.gov/standards/mods/v3/mods-3-2.xsd" xmlns="http://www.loc.gov/mods/v3"     
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <mods>
<titleInfo>
  <title>Roberto Giobbi's Card college. Volume 1</title>
</titleInfo>
<typeOfResource>text</typeOfResource>
<genre authority="local">book</genre>
<genre authority="marcgt">book</genre>
<name type="personal">
  <namePart type="family">Giobbi</namePart>
  <namePart type="given">Roberto</namePart>
  <role>
    <roleTerm type="code" authority="marcrelator">aut</roleTerm>
  </role>
</name>
<originInfo>
  <place>
    <placeTerm type="text">Seattle, Wash.</placeTerm>
  </place>
  <publisher>Hermetic Press</publisher>
  <copyrightDate>1996</copyrightDate>
  <issuance>monographic</issuance>
</originInfo>
<identifier type="isbn">0945296185</identifier>
<subject>
  <topic>Card tricks</topic>
</subject>
<note>External Resources: Cite This Item Search for versions with same title and author     
| Advanced options ...
Uniform Title: Grosse kartenschule. Band 1. English
Edition: Rev. 2nd ed. ; English language ed.
Language: English
Note(s): Includes bibliographical references (p. [245]-247) and index.
Other Titles: Card college
Responsibility: illustrated by Barbara Giobbi-Ebnöther ; translated from the German by     
Richard Hatch.
Vendor Info: Baker &amp; Taylor YBP Library Services (BKTY YANK) 32.00 Status:                 
active Note:               B&amp;T Title: Card College
Entry: 19960709
Update: 20091103
Provider: OCLC</note>
</mods>
<mods>
<titleInfo>
  <title>Book of magic.</title>
</titleInfo>
<typeOfResource>text</typeOfResource>
<genre authority="local">book</genre>
<genre authority="marcgt">book</genre>
<name type="personal">
  <namePart type="family">Warlock</namePart>
  <namePart type="given">Peter</namePart>
  <role>
    <roleTerm type="code" authority="marcrelator">aut</roleTerm>
  </role>
</name>
<originInfo>
  <publisher>London New York, Arco</publisher>
  <copyrightDate>1956</copyrightDate>
  <issuance>monographic</issuance>
</originInfo>
<subject>
  <topic>Magic tricks</topic>
</subject>
<note>External Resources: Cite This Item Search for versions with same title and author  
| Advanced options ...
Edition: [1st ed.]
Language: English
Class Descriptors: LC: GV1547; Dewey: 793.8
Entry: 19750729
Update: 20120116
Provider: OCLC</note>
</mods>
<mods>
<titleInfo>
  <title>The amateur magician's handbook,</title>
</titleInfo>
<typeOfResource>text</typeOfResource>
<genre authority="local">book</genre>
<genre authority="marcgt">book</genre>
<name type="personal">
  <namePart type="family">Hay, Henry</namePart>
  <namePart type="given"/>
  <role>
    <roleTerm type="code" authority="marcrelator">aut</roleTerm>
  </role>
</name>
<name type="personal">
  <namePart type="family">Mussey</namePart>
  <namePart type="given">June Barrows</namePart>
  <role>
    <roleTerm type="code" authority="marcrelator">aut</roleTerm>
  </role>
</name>
<originInfo>
  <publisher>New York, Crowell</publisher>
  <copyrightDate>1972</copyrightDate>
  <issuance>monographic</issuance>
</originInfo>
<identifier type="isbn">0690057113</identifier>
<subject>
  <topic>Magic tricks</topic>
</subject>
<note>External Resources: Cite This Item Search for versions with same title and author 
| Advanced options ...
Edition: 3d ed., rev. and expanded.
Language: English
Note(s): Bibliography: p. 365-373.
Class Descriptors: LC: GV1547; Dewey: 793.8
Responsibility: by Henry Hay. Photos. by Audrey Alley.
Vendor Info: Baker and Taylor (BTCP)
Entry: 19720814
Update: 20080829
Provider: OCLC</note>
</mods>
</modsCollection>

回答1:


So it's like a bibliography. Well, it depends on how you want to have it in FileMaker. The basic FileMaker XSLT will be like that:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
  xmlns:mod="http://www.loc.gov/mods/v3"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <FMPXMLRESULT xmlns="http://www.filemaker.com/fmpxmlresult">
      <ERRORCODE>0</ERRORCODE>
      <PRODUCT NAME="N/A" BUILD="N/A" VERSION="N/A"/>
      <DATABASE NAME="N/A" LAYOUT="N/A" RECORDS="1"
        DATEFORMAT="M/d/yyyy" TIMEFORMAT="h:mm:ss a"/>
      <METADATA>
        <!-- 1 -->
        <FIELD EMPTYOK="YES" MAXREPEAT="1" TYPE="NUMBER"
            NAME="Title" />
        <!-- More field definitions -->
      </METADATA>
      <RESULTSET>
        <xsl:for-each select="mod:modsCollection/mod:mods">
          <ROW MODID="1" RECORDID="1">
            <!-- 1. Title -->
            <COL>
              <DATA>
                <xsl:value-of select="mod:titleInfo/mod:title" />
              </DATA>
            </COL>
            <!-- More COL's in the same order as the fields -->
          </ROW>
        </xsl:for-each>
      </RESULTSET>
    </FMPXMLRESULT>
  </xsl:template>
</xsl:stylesheet>

This one should import the title. The template match="/" is like main() in C, it's the (typical) entry point. Once we get there we output the skeleton of the resulting XML.

Once we get to rows, we use a XSLT instruction to loop over elements that are to be records in our table; in our case these are mod:modsCollection/mod:mods, i.e. bibliography entries, but they could be anything; for instance, we can loop over all names (//mod:name). The mod: prefix is a shortcut for the Zotero namespace (http://www.loc.gov/mods/v3); in the original XML it is specified as the default namespace, so it's used without prefix, but in the XSLT I use the FileMaker XML namespace as default (see how I specify it in the FMPXMLRESULT) and define a prefix to refer to the Zotero elements.

The looping expression is an XPath expression; google it to find the full spec. Here I used a simple expression to get me all mods elements. As I go over them I output more FileMaker stationery (ROW) and then for each field also COL and DATA. Now, for the first field's DATA I need to read title data. Since I'm in the mods element, the path to the data is titleInfo/title; to get the value I use the xsl:value-of element.

To import more fields, add more field definitions and more COLs. To import something else (e.g. not the entries, but all the people) use a different expression in xsl:for-each. This should get you started :)



来源:https://stackoverflow.com/questions/12132470/xslt-to-translate-zotero-xml-output-to-fmpxmlresult-xml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!