You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

653 lines
28 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
QuakeML 1.2 to SC3ML 0.11 stylesheet converter
Author:
EOST (École et Observatoire des Sciences de la Terre)
Copyright:
The ObsPy Development Team (devs@obspy.org)
License:
GNU Lesser General Public License, Version 3
(https://www.gnu.org/copyleft/lesser.html)
Usage
=====
This stylesheet converts a QuakeML to a SC3ML document. It may be invoked using
xalan or xsltproc:
xalan -in quakeml.xml -xsl quakeml_1.2__sc3ml_0.11.xsl -out sc3ml.xml
xsltproc quakeml_1.2__sc3ml_0.11.xsl quakeml.xml > sc3ml.xml
Due to the QuakeML ID schema the public IDs used by QuakeML are rather long
and may cause problems in SeisComP application when displaying or processing
them. Especially the slash causes problems, e.g. when an event ID is used on
the command line or in a directory structure. To remove the ID prefix during
the conversion you may use the ID_PREFIX parameter:
xalan -param ID_PREFIX "'smi:org.gfz-potsdam.de/geofon/'" -in quakeml.xml -xsl quakeml_1.2__sc3ml_0.11.xsl -out sc3ml.xml
xsltproc -stringparam ID_PREFIX smi:org.gfz-potsdam.de/geofon/ quakeml_1.2__sc3ml_0.11.xsl quakeml.xml > sc3ml.xml
Transformation
==============
QuakeML and SC3ML are quite similar schemas. Nevertheless some differences
exist.
ID restrictions
```````````````
SC3ML does not enforce any particular ID restriction unlike QuakeML. It isn't
a problem to convert from QuakeML to SC3ML.
Repositioning and creation of nodes
```````````````````````````````````
In SC3ML all information is grouped under the EventParameters element.
<EventParameters> <eventParameters>
<event>
<pick/> <pick/>
<amplitude/> <amplitude/>
<reading/>
<origin> <origin/>
<stationMagnitude/> <stationMagnitude/>
<magnitude/> <magnitude/>
</origin>
<focalMechanism/> <focalMechanism/>
<event/> </event>
</EventParameters> </eventParameters>
Since origins and focalMechanism aren't in an event anymore, OriginReferences
and FocalMechanismReferences need to be created.
Some nodes are also mandatory in SC3ML which aren't in QuakeML:
- event/description/type
- dataUsed/stationCount
- dataUsed/componentCount
- amplitude/type
Renaming of nodes
`````````````````
The following table lists the mapping of names between both schema:
Parent QuakeML name SC3 name
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
seiscomp eventParameters EventParameters
arrival [copied from following fields if true] weight
timeUsed timeWeight
horizontalSlownessUsed horizontalSlownessWeight
backazimuthUsed backazimuthWeight
arrival takeoffAngle (RealQuantity) takeOffAngle (double)
magnitude mag magnitude
stationMagnitude mag magnitude
amplitude genericAmplitude amplitude
origin originUncertainty uncertainty
momentTensor category method
comment @id (attribute) id
waveformID text() resourceURI
Enumerations
````````````
Both schema use enumerations. Numerous mappings are applied.
Unit conversion
```````````````
QuakeML uses meter for origin depth, origin uncertainty and confidence
ellipsoid, SC3ML uses kilometer.
Unmapped node
`````````````
The following nodes can not be mapped to the SC3ML schema, thus their data is
lost:
Parent Element lost
''''''''''''''''''''''''''''''''''''''''''''
amplitude evaluationStatus
magnitude evaluationMode
originUncertainty confidenceLevel
arrival commment
arrival horizontalSlownessWeight
arrival backazimuthWeight
origin region
dataUsed longestPeriod
momentTensor inversionType
focalMechanism waveformID
Nodes order
```````````
Unlike SC3ML, QuakeML nodes can appear in any order. They must be reordered for
SC3ML. Unnecessary attributes must also be removed.
Change log
==========
* 16.06.2021: Add ID_PREFIX parameter allowing to strip QuakeML ID prefix from
publicIDs and references thereof
* 22.06.2021: Add Z suffix to xs:dateTime values
-->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ext="http://exslt.org/common"
xmlns="http://geofon.gfz-potsdam.de/ns/seiscomp3-schema/0.11"
xmlns:qml="http://quakeml.org/xmlns/bed/1.2"
xmlns:q="http://quakeml.org/xmlns/quakeml/1.2"
exclude-result-prefixes="xsl xs ext q qml">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- Define parameters-->
<xsl:param name="ID_PREFIX" select="'smi:org.gfz-potsdam.de/geofon/'"/>
<xsl:param name="ID_PREFIX_NA" select="concat($ID_PREFIX, 'NA')"/>
<!-- Define some global variables -->
<xsl:variable name="version" select="'0.11'"/>
<xsl:variable name="schema" select="document('sc3ml_0.11.xsd')"/>
<xsl:variable name="PID" select="'publicID'"/>
<!-- Define key to remove duplicates-->
<xsl:key name="pick_key" match="qml:pick" use="@publicID"/>
<xsl:key name="amplitude_key" match="qml:amplitude" use="@publicID"/>
<xsl:key name="origin_key" match="qml:origin" use="@publicID"/>
<xsl:key name="focalMechanism_key" match="qml:focalMechanism" use="@publicID"/>
<!--
***************************************************************************
Move/create nodes
***************************************************************************
-->
<!-- Default match: Map node 1:1 -->
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="node()"/>
</xsl:element>
</xsl:template>
<!-- Starting point: Match the root node and select the EventParameters
node -->
<xsl:template match="/">
<!-- Write a disordered sc3ml in this variable. It will be ordered in
a second time. -->
<xsl:variable name="disordered">
<xsl:for-each select="./q:quakeml/qml:eventParameters">
<EventParameters>
<xsl:apply-templates select="@publicID"/>
<xsl:apply-templates/>
</EventParameters>
</xsl:for-each>
</xsl:variable>
<!-- Reorder nodes -->
<seiscomp version="{$version}">
<xsl:apply-templates select="ext:node-set($disordered)" mode="reorder"/>
</seiscomp>
</xsl:template>
<xsl:template match="qml:event">
<!-- Create event node -->
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
<!-- Create origin references -->
<xsl:for-each select="qml:origin[count(. | key('origin_key', @publicID)[1]) = 1]">
<xsl:element name="originReference">
<xsl:call-template name="convertID">
<xsl:with-param name="id" select="@publicID"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
<!-- Create focal mechanism references -->
<xsl:for-each select="qml:focalMechanism[count(. | key('focalMechanism_key', @publicID)[1]) = 1]">
<xsl:element name="focalMechanismReference">
<xsl:call-template name="convertID">
<xsl:with-param name="id" select="@publicID"/>
</xsl:call-template>
</xsl:element>
</xsl:for-each>
</xsl:element>
<!-- Copy picks and remove duplicates -->
<xsl:for-each select="qml:pick[count(. | key('pick_key', @publicID)[1]) = 1]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
<!-- Copy amplitudes and remove duplicates -->
<xsl:for-each select="qml:amplitude[count(. | key('amplitude_key', @publicID)[1]) = 1]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:if test="not(qml:type)">
<xsl:element name="type"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
<!-- Copy origins and remove duplicates -->
<xsl:for-each select="qml:origin[count(. | key('origin_key', @publicID)[1]) = 1]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<!-- Copy magnitudes and remove duplicates -->
<xsl:for-each select="../qml:magnitude[qml:originID/text()=current()/@publicID]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
<!-- Copy stations magnitudes and remove duplicates -->
<xsl:for-each select="../qml:stationMagnitude[qml:originID/text()=current()/@publicID]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
<!-- Copy focal mechanisms and remove duplicates -->
<xsl:for-each select="qml:focalMechanism[count(. | key('focalMechanism_key', @publicID)[1]) = 1]">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:for-each>
</xsl:template>
<!-- Create mandatory element event/description/type -->
<xsl:template match="qml:event/qml:description">
<xsl:element name="{local-name()}">
<xsl:if test="not(qml:type)">
<xsl:element name="type">region name</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- Create mandatory elements dataUsed/stationCount and
dataUsed/componentCount -->
<xsl:template match="qml:dataUsed">
<xsl:element name="{local-name()}">
<xsl:if test="not(qml:stationCount)">
<xsl:element name="stationCount"/>
</xsl:if>
<xsl:if test="not(qml:componentCount)">
<xsl:element name="componentCount"/>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!--
***************************************************************************
Rename nodes/attributes
***************************************************************************
-->
<!-- Manage arrival/weight -->
<xsl:template match="qml:arrival/qml:timeWeight">
<xsl:element name="weight">
<xsl:apply-templates/>
</xsl:element>
<xsl:element name="timeUsed">true</xsl:element>
</xsl:template>
<xsl:template match="qml:arrival/qml:horizontalSlownessWeight">
<xsl:if test="not(../qml:timeWeight)">
<xsl:element name="weight">
<xsl:apply-templates/>
</xsl:element>
<xsl:element name="horizontalSlownessUsed">true</xsl:element>
</xsl:if>
</xsl:template>
<xsl:template match="qml:arrival/qml:backazimuthWeight">
<xsl:if test="not(../qml:timeWeight) and not(../qml:horizontalSlownessWeight)">
<xsl:element name="weight">
<xsl:apply-templates/>
</xsl:element>
<xsl:element name="backazimuthUsed">true</xsl:element>
</xsl:if>
</xsl:template>
<!-- arrival/takeoffAngle -> arrival/takeOffAngle -->
<xsl:template match="qml:arrival/qml:takeoffAngle">
<xsl:element name="takeOffAngle">
<xsl:value-of select="qml:value"/>
</xsl:element>
</xsl:template>
<!-- magnitude/mag -> magnitude/magnitude -->
<!-- stationMagnitude/mag -> stationMagnitude/magnitude -->
<xsl:template match="qml:magnitude/qml:mag
| qml:stationMagnitude/qml:mag">
<xsl:element name="magnitude">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- amplitude/genericAmplitutde -> amplitude/amplitude -->
<xsl:template match="qml:amplitude/qml:genericAmplitude">
<xsl:element name="amplitude">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- origin/originUncertainty -> origin/uncertainty -->
<xsl:template match="qml:origin/qml:originUncertainty">
<xsl:element name="uncertainty">
<xsl:apply-templates select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- momentTensor/category -> momentTensor/method -->
<xsl:template match="qml:momentTensor/qml:category">
<xsl:element name="method">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- comment/@id -> comment/id -->
<xsl:template match="qml:comment">
<xsl:element name="{local-name()}">
<xsl:if test="@id != ''">
<xsl:element name="id">
<xsl:value-of select="@id"/>
</xsl:element>
</xsl:if>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<!-- waveformID/text() -> waveformID/resourceURI -->
<xsl:template match="qml:waveformID">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:if test="current() != ''">
<xsl:element name="resourceURI">
<xsl:value-of select="."/>
</xsl:element>
</xsl:if>
</xsl:element>
</xsl:template>
<!--
***************************************************************************
Enumeration mapping
***************************************************************************
-->
<xsl:template match="qml:event/qml:type">
<xsl:element name="{local-name()}">
<xsl:variable name="v" select="."/>
<xsl:choose>
<xsl:when test="$v='other event'">other</xsl:when>
<xsl:otherwise><xsl:value-of select="$v"/></xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template match="qml:origin/qml:depthType">
<xsl:element name="{local-name()}">
<xsl:variable name="v" select="."/>
<xsl:choose>
<xsl:when test="$v='constrained by depth and direct phases'">other</xsl:when>
<xsl:otherwise><xsl:value-of select="$v"/></xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<xsl:template match="qml:momentTensor/qml:dataUsed/qml:waveType">
<xsl:element name="{local-name()}">
<xsl:variable name="v" select="."/>
<xsl:choose>
<xsl:when test="$v='P waves'">P body waves</xsl:when>
<xsl:when test="$v='mantle waves'">long-period mantle waves</xsl:when>
<xsl:when test="$v='combined'">unknown</xsl:when>
<xsl:otherwise><xsl:value-of select="$v"/></xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!--
***************************************************************************
Unit conversion
***************************************************************************
-->
<!-- SC3ML uses kilometer, QuakeML meter -->
<xsl:template match="qml:origin/qml:depth/qml:value
| qml:origin/qml:depth/qml:uncertainty
| qml:origin/qml:depth/qml:lowerUncertainty
| qml:origin/qml:depth/qml:upperUncertainty
| qml:origin/qml:originUncertainty/qml:horizontalUncertainty
| qml:origin/qml:originUncertainty/qml:minHorizontalUncertainty
| qml:origin/qml:originUncertainty/qml:maxHorizontalUncertainty
| qml:confidenceEllipsoid/qml:semiMajorAxisLength
| qml:confidenceEllipsoid/qml:semiMinorAxisLength
| qml:confidenceEllipsoid/qml:semiIntermediateAxisLength">
<xsl:element name="{local-name()}">
<xsl:value-of select="current() div 1000"/>
</xsl:element>
</xsl:template>
<!--
***************************************************************************
Time conversion
***************************************************************************
-->
<!-- SeisComP < 5 requires date time values to end on Z -->
<xsl:template match="qml:time/qml:value
| qml:scalingTime/qml:value
| qml:timeWindow/qml:reference
| qml:creationTime">
<xsl:element name="{local-name()}">
<xsl:variable name="v" select="current()"/>
<xsl:choose>
<xsl:when test="substring($v, string-length($v))='Z'">
<xsl:value-of select="$v"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($v, 'Z')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!--
***************************************************************************
Delete moved/unmapped nodes
***************************************************************************
-->
<xsl:template match="qml:pick"/>
<xsl:template match="qml:amplitude"/>
<xsl:template match="qml:origin"/>
<xsl:template match="qml:magnitude"/>
<xsl:template match="qml:stationMagnitude"/>
<xsl:template match="qml:focalMechanism"/>
<xsl:template match="qml:amplitude/qml:category"/>
<xsl:template match="qml:amplitude/qml:evaluationStatus"/>
<xsl:template match="qml:magnitude/qml:evaluationMode"/>
<xsl:template match="qml:originUncertainty/qml:confidenceLevel"/>
<xsl:template match="qml:arrival/qml:comment"/>
<xsl:template match="qml:origin/qml:region"/>
<xsl:template match="qml:dataUsed/qml:longestPeriod"/>
<xsl:template match="qml:momentTensor/qml:inversionType"/>
<xsl:template match="qml:focalMechanism/qml:waveformID"/>
<!--
***************************************************************************
Reorder element nodes
***************************************************************************
-->
<xsl:template match="*" mode="reorder">
<!-- Detect complexType from node name -->
<xsl:variable name="name">
<xsl:variable name="v" select="local-name()"/>
<xsl:variable name="p" select="local-name(..)"/>
<xsl:choose>
<xsl:when test="$v='scalingTime'">TimeQuantity</xsl:when>
<xsl:when test="$v='time'">TimeQuantity</xsl:when>
<xsl:when test="$v='creationInfo'">CreationInfo</xsl:when>
<xsl:when test="$p='event' and $v='description'">EventDescription</xsl:when>
<xsl:when test="$v='comment'">Comment</xsl:when>
<xsl:when test="$p='tAxis' and $v='azimuth'">RealQuantity</xsl:when>
<xsl:when test="$p='pAxis' and $v='azimuth'">RealQuantity</xsl:when>
<xsl:when test="$p='nAxis' and $v='azimuth'">RealQuantity</xsl:when>
<xsl:when test="$v='plunge'">RealQuantity</xsl:when>
<xsl:when test="$v='length'">RealQuantity</xsl:when>
<xsl:when test="$v='second'">RealQuantity</xsl:when>
<xsl:when test="$v='Mrr'">RealQuantity</xsl:when>
<xsl:when test="$v='Mtt'">RealQuantity</xsl:when>
<xsl:when test="$v='Mpp'">RealQuantity</xsl:when>
<xsl:when test="$v='Mrt'">RealQuantity</xsl:when>
<xsl:when test="$v='Mrp'">RealQuantity</xsl:when>
<xsl:when test="$v='Mtp'">RealQuantity</xsl:when>
<xsl:when test="$v='strike'">RealQuantity</xsl:when>
<xsl:when test="$p='nodalPlane1' and $v='dip'">RealQuantity</xsl:when>
<xsl:when test="$p='nodalPlane2' and $v='dip'">RealQuantity</xsl:when>
<xsl:when test="$v='rake'">RealQuantity</xsl:when>
<xsl:when test="$v='scalarMoment'">RealQuantity</xsl:when>
<xsl:when test="$p='amplitude' and $v='amplitude'">RealQuantity</xsl:when>
<xsl:when test="$v='period'">RealQuantity</xsl:when>
<xsl:when test="$p='magnitude' and $v='magnitude'">RealQuantity</xsl:when>
<xsl:when test="$p='stationMagnitude' and $v='magnitude'">RealQuantity</xsl:when>
<xsl:when test="$v='horizontalSlowness'">RealQuantity</xsl:when>
<xsl:when test="$v='backazimuth'">RealQuantity</xsl:when>
<xsl:when test="$p='origin' and $v='latitude'">RealQuantity</xsl:when>
<xsl:when test="$p='origin' and $v='longitude'">RealQuantity</xsl:when>
<xsl:when test="$p='origin' and $v='depth'">RealQuantity</xsl:when>
<xsl:when test="$v='year'">IntegerQuantity</xsl:when>
<xsl:when test="$v='month'">IntegerQuantity</xsl:when>
<xsl:when test="$v='day'">IntegerQuantity</xsl:when>
<xsl:when test="$v='hour'">IntegerQuantity</xsl:when>
<xsl:when test="$v='minute'">IntegerQuantity</xsl:when>
<xsl:when test="$v='tAxis'">Axis</xsl:when>
<xsl:when test="$v='pAxis'">Axis</xsl:when>
<xsl:when test="$v='nAxis'">Axis</xsl:when>
<xsl:when test="$v='principalAxes'">PrincipalAxes</xsl:when>
<xsl:when test="$v='dataUsed'">DataUsed</xsl:when>
<xsl:when test="$v='compositeTime'">CompositeTime</xsl:when>
<xsl:when test="$v='tensor'">Tensor</xsl:when>
<xsl:when test="$v='quality'">OriginQuality</xsl:when>
<xsl:when test="$v='nodalPlane1'">NodalPlane</xsl:when>
<xsl:when test="$v='nodalPlane2'">NodalPlane</xsl:when>
<xsl:when test="$v='timeWindow'">TimeWindow</xsl:when>
<xsl:when test="$v='waveformID'">WaveformStreamID</xsl:when>
<xsl:when test="$v='sourceTimeFunction'">SourceTimeFunction</xsl:when>
<xsl:when test="$v='nodalPlanes'">NodalPlanes</xsl:when>
<xsl:when test="$v='confidenceEllipsoid'">ConfidenceEllipsoid</xsl:when>
<xsl:when test="$v='reading'">Reading</xsl:when>
<xsl:when test="$v='component'">MomentTensorComponentContribution</xsl:when>
<xsl:when test="$v='stationMomentTensorContribution'">MomentTensorStationContribution</xsl:when>
<xsl:when test="$v='phaseSetting'">MomentTensorPhaseSetting</xsl:when>
<xsl:when test="$v='momentTensor'">MomentTensor</xsl:when>
<xsl:when test="$v='focalMechanism'">FocalMechanism</xsl:when>
<xsl:when test="$p='EventParameters' and $v='amplitude'">Amplitude</xsl:when>
<xsl:when test="$v='stationMagnitudeContribution'">StationMagnitudeContribution</xsl:when>
<xsl:when test="$p='origin' and $v='magnitude'">Magnitude</xsl:when>
<xsl:when test="$v='stationMagnitude'">StationMagnitude</xsl:when>
<xsl:when test="$v='pick'">Pick</xsl:when>
<xsl:when test="$v='event'">Event</xsl:when>
<xsl:when test="$p='origin' and $v='uncertainty'">OriginUncertainty</xsl:when>
<xsl:when test="$v='arrival'">Arrival</xsl:when>
<xsl:when test="$v='origin'">Origin</xsl:when>
<xsl:when test="$v='EventParameters'">EventParameters</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:variable>
<xsl:variable name="current" select="."/>
<xsl:element name="{local-name()}">
<xsl:choose>
<xsl:when test="$name=''">
<!-- Not a complexType, don't reorder -->
<xsl:apply-templates select="node()" mode="reorder"/>
</xsl:when>
<xsl:otherwise>
<!-- This node is a complexType. -->
<!-- Only copy allowed attributes -->
<xsl:for-each select="$schema//xs:complexType[@name=$name]
/xs:attribute/@name">
<xsl:apply-templates select="$current/@*[local-name()=current()]"/>
</xsl:for-each>
<!-- Reorder nodes according to the XSD -->
<xsl:for-each select="$schema//xs:complexType[@name=$name]
/xs:sequence/xs:element/@name">
<xsl:apply-templates select="$current/*[local-name()=current()]"
mode="reorder"/>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- Removes ID_PREFIX, if the remainder is 'NA' an empty string is returned -->
<xsl:template name="convertID">
<xsl:param name="id"/>
<xsl:choose>
<xsl:when test="$id=$ID_PREFIX_NA">
<xsl:value-of select="''"/>
</xsl:when>
<xsl:when test="starts-with($id, $ID_PREFIX)">
<xsl:value-of select="substring-after($id, $ID_PREFIX)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$id"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- Remove ID_PREFIX from publicID attributes -->
<xsl:template match="@publicID">
<xsl:variable name="id">
<xsl:call-template name="convertID">
<xsl:with-param name="id" select="current()"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$id != ''">
<xsl:attribute name="{$PID}">
<xsl:value-of select="$id"/>
</xsl:attribute>
</xsl:if>
</xsl:template>
<xsl:template match="@*">
<xsl:copy-of select="."/>
</xsl:template>
<!-- Value of ID nodes must be stripped from ID_PREFIX -->
<xsl:template match="qml:agencyURI|qml:authorURI|qml:pickID|qml:methodID|qml:earthModelID|qml:amplitudeID|qml:originID|qml:stationMagnitudeID|qml:preferredOriginID|qml:preferredMagnitudeID|qml:originReference|qml:filterID|qml:slownessMethodID|qml:pickReference|qml:amplitudeReference|qml:referenceSystemID|qml:triggeringOriginID|qml:derivedOriginID|momentMagnitudeID|qml:preferredFocalMechanismID|qml:focalMechanismReference|qml:momentMagnitudeID|qml:greensFunctionID">
<xsl:variable name="id">
<xsl:call-template name="convertID">
<xsl:with-param name="id" select="string(.)"/>
</xsl:call-template>
</xsl:variable>
<xsl:if test="$id != ''">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$id"/>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>