Difference between revisions of "Change2change.xslt"

From TEIWiki
Jump to navigation Jump to search
m
 
(10 intermediate revisions by 3 users not shown)
Line 1: Line 1:
The P5 <change> element is significantly different than the P4 <change> element. This stylesheet reads in a TEI P4 XML file and writes out the same file but with P5-format <change> elements. It is not really intended to be used on its own, but rather the intent is for the main template to be copied and pasted (with appropriate attribution and GPL or LGPL licensing, etc., etc.) into a larger P4-to-P5 framework.
+
The P5 <change> element is significantly different than the P4 <change> element. This stylesheet reads in a TEI P4 XML file and writes out the same file but with P5-format <change> elements.
 
<hr />
 
<hr />
<pre>
+
<pre><nowiki><?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8"?>
 
  
 
<!-- Tiny XSLT 1.0 stylesheet that reads in a TEI file with <change> elements -->
 
<!-- Tiny XSLT 1.0 stylesheet that reads in a TEI file with <change> elements -->
Line 9: Line 8:
 
<!-- Copyleft 2006 Syd Bauman and the Text Encoding Initiative Consortium -->
 
<!-- Copyleft 2006 Syd Bauman and the Text Encoding Initiative Consortium -->
  
<!-- The output of this stylesheet is not P5-comnpliant XML; in fact, even the -->
+
<!-- The output of this stylesheet is not P5-compliant XML; in fact, even the -->
 
<!-- one element we are changing, namely <change>, may not be valid P5. This is -->
 
<!-- one element we are changing, namely <change>, may not be valid P5. This is -->
 
<!-- because although we move all the bits of information to the right place, it -->
 
<!-- because although we move all the bits of information to the right place, it -->
 
<!-- may still be in the wrong format. E.g., a <date value="2006-01-31">31 Jan -->
 
<!-- may still be in the wrong format. E.g., a <date value="2006-01-31">31 Jan -->
<!-- 06</date> will be transformed to the valid date="2006-01-31", but a <date>31 -->
+
<!-- 06</date> will be transformed to the valid when="2006-01-31", but a <date>31 -->
<!-- Jan 06</date> will be tranformed to the invalid date="31 Jan 06". -->
+
<!-- Jan 06</date> will be tranformed to the invalid when="31 Jan 06". -->
  
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 
                 xmlns:tei="http://www.tei-c.org/ns/1.0"
 
                 xmlns:tei="http://www.tei-c.org/ns/1.0"
 
                 version="1.0">
 
                 version="1.0">
 +
 +
  <xsl:import href="Copy-All.xsl"/>
  
 
   <xsl:output method="xml"
 
   <xsl:output method="xml"
 
     encoding="UTF-8"
 
     encoding="UTF-8"
     cdata-section-elements="eg"/>
+
     cdata-section-elements="eg"/>  
 
 
  <!-- Generic copy-everything template -->
 
  <xsl:template match="@*|*|processing-instruction()|comment()">
 
    <xsl:copy>
 
      <xsl:apply-templates select="*|@*|text()|processing-instruction()|comment()"/>
 
    </xsl:copy>
 
  </xsl:template>
 
  
 
   <!-- special template for <change> elements that have to change -->
 
   <!-- special template for <change> elements that have to change -->
 
   <xsl:template match="revisionDesc/change">
 
   <xsl:template match="revisionDesc/change">
 
     <xsl:element name="change">
 
     <xsl:element name="change">
       <xsl:attribute name="date">
+
       <xsl:attribute name="when">
         <!-- For the value of the new date= attribute ... -->
+
         <!-- For the value of the new when= attribute ... -->
 
         <!-- look at my child <date> element, -->
 
         <!-- look at my child <date> element, -->
 
         <xsl:choose>
 
         <xsl:choose>
Line 89: Line 83:
 
   </xsl:template>
 
   </xsl:template>
  
</xsl:stylesheet>
+
</xsl:stylesheet></nowiki>
 
</pre>
 
</pre>
 +
[[Category:XSLT]]
 
[[Category:P4toP5]]
 
[[Category:P4toP5]]
 
[[User:Syd|Syd]] 06:51, 26 May 2006 (BST)
 
[[User:Syd|Syd]] 06:51, 26 May 2006 (BST)

Latest revision as of 09:25, 14 March 2010

The P5 <change> element is significantly different than the P4 <change> element. This stylesheet reads in a TEI P4 XML file and writes out the same file but with P5-format <change> elements.


<?xml version="1.0" encoding="utf-8"?>

<!-- Tiny XSLT 1.0 stylesheet that reads in a TEI file with <change> elements -->
<!-- that conform to P4, and writes out the same with <change> elements that -->
<!-- are likely to conform to P5 (pre-release 0.3.1). -->
<!-- Copyleft 2006 Syd Bauman and the Text Encoding Initiative Consortium -->

<!-- The output of this stylesheet is not P5-compliant XML; in fact, even the -->
<!-- one element we are changing, namely <change>, may not be valid P5. This is -->
<!-- because although we move all the bits of information to the right place, it -->
<!-- may still be in the wrong format. E.g., a <date value="2006-01-31">31 Jan -->
<!-- 06</date> will be transformed to the valid when="2006-01-31", but a <date>31 -->
<!-- Jan 06</date> will be tranformed to the invalid when="31 Jan 06". -->

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

  <xsl:import href="Copy-All.xsl"/>

  <xsl:output method="xml"
    encoding="UTF-8"
    cdata-section-elements="eg"/> 

  <!-- special template for <change> elements that have to change -->
  <xsl:template match="revisionDesc/change">
    <xsl:element name="change">
      <xsl:attribute name="when">
        <!-- For the value of the new when= attribute ... -->
        <!-- look at my child <date> element, -->
        <xsl:choose>
          <!-- if it has a value= attribute, use its value -->
          <xsl:when test="./date/@value">
            <xsl:value-of select="./date/@value"/>
          </xsl:when>
          <!-- if not, use its content -->
          <xsl:otherwise>
            <xsl:value-of select="./date/text()"/>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:attribute>
      <xsl:attribute name="who">
        <!-- For the value of the new who= attribute ... -->
        <!-- look at my child <respStmt>'s first <name> child ... -->
        <!-- (warn if there's more than 1 <name> child of <respStmt>) -->
        <xsl:if test="count(./respStmt/name)>1">
          <xsl:message> warning: more than one <name> child of <respStmt>, using the first </xsl:message>
        </xsl:if>
        <xsl:variable name="respName">
          <xsl:choose>
            <!-- ... if it has a key=, use its value -->
            <xsl:when test="./respStmt/name/@key">
              <xsl:value-of select="./respStmt/name/@key"/>
            </xsl:when>
            <!-- ... if no key=, if it has a reg=, use its value -->
            <xsl:when test="./respStmt/name/@reg">
              <xsl:value-of select="./respStmt/name/@reg"/>
            </xsl:when>
            <!-- ... neither key= nor reg=, use content -->
            <xsl:otherwise>
              <xsl:value-of select="./respStmt/name/text()"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <!-- ... now that we have a name, strip out icky characters -->
        <xsl:variable name="respVal" select='translate(normalize-space($respName),"-,'&#$%^!~`={}[]<>?/:; +=\|@","-")'/>
        <!-- [Note that hyphens are left in place, as they are valid NAME characters.] -->
        <!-- This is not the right way to do this. What we really want is not to strip -->
        <!-- out the few non-NAME characters I can think of and type easily, but rather -->
        <!-- we'd prefer to keep only the NAME characters and ditch everything else. -->
        <!-- I don't know if that can be done in XSLT 1.0, and if it can, I don't know -->
        <!-- how to do it. Note also that we do not check that the first char is -->
        <!-- a NAMESTART character. -->
        <!-- ... and stick a "#" in front -->
        <xsl:text>#</xsl:text>
        <xsl:value-of select="$respVal"/>
      </xsl:attribute>
      <!-- content of new <change> is the content of old <change>'s child <item> -->
      <xsl:apply-templates select="./item/*|./item/text()|./item/processing-instruction()|./item/comment()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

Syd 06:51, 26 May 2006 (BST)