File: chado-insert-macros.xsl

package info (click to toggle)
libchado-perl 1.23-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 23,976 kB
  • ctags: 10,378
  • sloc: xml: 192,540; sql: 165,945; perl: 28,339; sh: 101; python: 73; makefile: 46
file content (127 lines) | stat: -rw-r--r-- 4,399 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?xml version="1.0" encoding="utf-8"?>

<!-- Creates macros for repeated cv, cvterm and organism elements -->

<!-- Macro IDs correspond to unique key constraints in chado db -->
<!-- UK constraints are combined using double-underscore: '__' -->

<!-- AUTHOR: Chris Mungall  cjm at fruitfly dot org  -->

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0">

  <xsl:output indent="yes" method="xml"/>

  <!-- INDEXES -->
  <!-- create an index of every element by its database unique key -->

  <!-- ORGANISM INDEX -->
  <xsl:key name="k-organism_id" match="//organism_id[*]" use="concat(organism/genus,'__',organism/species)"/>
  <!-- DB INDEX -->
  <xsl:key name="k-db_id" match="//db_id[*]" use="db/name"/>
  <!-- CV INDEX -->
  <xsl:key name="k-cv_id" match="//cv_id[*]" use="cv/name"/>
  <!-- CVTERM-BY-TYPE_ID INDEX -->
  <xsl:key name="k-type_id" match="//type_id[*]" use="concat(cvterm/cv_id/cv/name,'__',cvterm/name)"/>

  <!-- UNIQUE NODESETS -->
  <!-- create a unique instance of each macroifyable element -->
  
  <!-- DISTINCT ORGANISMs -->
  <xsl:variable 
    name="u-organism_id"
    select="//organism_id[generate-id(.)=generate-id(key('k-organism_id',concat(organism/genus,'__',organism/species))[1])]"/>

  <!-- DISTINCT CVTERMs (by type_id) -->
  <xsl:variable 
    name="u-type_id"
    select="//type_id[generate-id(.)=generate-id(key('k-type_id',concat(cvterm/cv_id/cv/name,'__',cvterm/name))[1])]"/>

  <!-- DISTINCT CVs -->
  <xsl:variable 
    name="u-cv_id"
    select="//cv_id[generate-id(.)=generate-id(key('k-cv_id',cv/name)[1])]"/>

  <!-- DISTINCT DBs -->
  <xsl:variable 
    name="u-db_id"
    select="//db_id[generate-id(.)=generate-id(key('k-db_id',db/name)[1])]"/>

  <!-- ** TEMPLATES ** -->

  <!-- INITIAL MATCH -->
  <xsl:template match="/chado">
    <chado>
      <!-- insect organism macro -->
      <xsl:for-each select="$u-organism_id">
        <xsl:apply-templates mode="insert-macro" select="organism">
          <xsl:with-param name="macro-id" select="concat(organism/genus,'__',organism/species)"/>
        </xsl:apply-templates>
      </xsl:for-each>
      <!-- insect db macro -->
      <xsl:for-each select="$u-db_id">
        <xsl:apply-templates mode="insert-macro" select="db">
          <xsl:with-param name="macro-id" select="concat('db__',db/name)"/>
        </xsl:apply-templates>
      </xsl:for-each>
      <!-- insect cv macro -->
      <xsl:for-each select="$u-cv_id">
        <xsl:apply-templates mode="insert-macro" select="cv">
          <xsl:with-param name="macro-id" select="concat('cv__',cv/name)"/>
        </xsl:apply-templates>
      </xsl:for-each>
      <!-- insect cvterm macro -->
      <xsl:for-each select="$u-type_id">
        <xsl:apply-templates mode="insert-macro" select="cvterm">
          <xsl:with-param name="macro-id" select="concat(cvterm/cv_id/cv/name,'__',cvterm/name)"/>
        </xsl:apply-templates>
      </xsl:for-each>

      <!-- process everything else as normal -->
      <xsl:apply-templates mode="main" select="*"/>
    </chado>
  </xsl:template>

  <!-- INSERT MACRO DEFINITION -->
  <xsl:template mode="insert-macro" match="*">
    <xsl:param name="macro-id"/>
    <xsl:copy>
      <xsl:attribute name="id">
        <xsl:value-of select="$macro-id"/>
      </xsl:attribute>
      <xsl:apply-templates mode="main" select="*"/>
    </xsl:copy>
  </xsl:template>

  <!-- NORMAL PROCESSING (RECURSIVE) -->
  <xsl:template mode="main" match="/ | @* | node()">
    <xsl:choose>
      <xsl:when test="name(.)='organism_id'">
        <xsl:copy>
          <xsl:value-of select="concat(organism/genus,'__',organism/species)"/>
        </xsl:copy>
      </xsl:when>
      <xsl:when test="name(.)='type_id'">
        <xsl:copy>
          <xsl:value-of select="concat(cvterm/cv_id/cv/name,'__',cvterm/name)"/>
        </xsl:copy>
      </xsl:when>
      <xsl:when test="name(.)='cv_id'">
        <xsl:copy>
          <xsl:value-of select="concat('cv__',cv/name)"/>
        </xsl:copy>
      </xsl:when>
      <xsl:when test="name(.)='db_id'">
        <xsl:copy>
          <xsl:value-of select="concat('db__',db/name)"/>
        </xsl:copy>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates mode="main" select="@* | node()" />
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

</xsl:stylesheet>