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 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
<?xml version="1.0" encoding="utf-8"?>
<!--
/=====================================================================\
| LaTeXML-math-mathml.xsl |
| copy MathML for xhtml |
|=====================================================================|
| Part of LaTeXML: |
| Public domain software, produced as part of work done by the |
| United States Government & not subject to copyright in the US. |
|=====================================================================|
| Bruce Miller <bruce.miller@nist.gov> #_# |
| http://dlmf.nist.gov/LaTeXML/ (o o) |
\=========================================================ooo==U==ooo=/
-->
<xsl:stylesheet
version = "1.0"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:ltx = "http://dlmf.nist.gov/LaTeXML"
xmlns:m = "http://www.w3.org/1998/Math/MathML"
xmlns:f = "http://dlmf.nist.gov/LaTeXML/functions"
extension-element-prefixes="f"
exclude-result-prefixes = "ltx f">
<xsl:param name="MathML_NAMESPACE">http://www.w3.org/1998/Math/MathML</xsl:param>
<!-- Use MathML (if available in source) -->
<xsl:param name="USE_MathML">true</xsl:param>
<!-- If NOT using MathML, should we avoid using images to represent pure numbers? -->
<xsl:param name="USE_NUMBER_IMAGES"></xsl:param>
<!-- The namespace to use on MathML elements (typically MathML_NAMESPACE or none) -->
<xsl:param name="mml_ns">
<xsl:value-of select="f:if($USE_NAMESPACES,$MathML_NAMESPACE,'')"/>
</xsl:param>
<xsl:strip-space elements="ltx:Math"/>
<xsl:template match="ltx:Math">
<xsl:choose>
<!-- Prefer MathML, if allowed -->
<xsl:when test="m:math and $USE_MathML">
<xsl:apply-templates select="." mode="as-MathML"/>
</xsl:when>
<!-- Optionally avoid using images for pure numbers -->
<xsl:when test="not($USE_NUMBER_IMAGES) and ltx:XMath[count(*)=1][ltx:XMTok[1][@role='NUMBER']]">
<xsl:value-of select="ltx:XMath/ltx:XMTok/text()"/>
</xsl:when>
<xsl:when test="not($USE_NUMBER_IMAGES) and
ltx:XMath[count(*)=1][ltx:XMApp[count(*)=2
and ltx:XMTok[1][@meaning='minus']
and ltx:XMTok[2][@role='NUMBER']]]">
<xsl:value-of select="concat('−',ltx:XMath/ltx:XMApp/ltx:XMTok[2]/text())"/>
</xsl:when>
<!-- If we reach any Math nested within Math, just copy as-is (should be appropriate target)-->
<xsl:when test="ancestor::ltx:Math">
<xsl:apply-templates mode='copy-foreign'/>
</xsl:when>
<!-- Or use images for math (Ugh!)-->
<xsl:when test="@imagesrc">
<xsl:apply-templates select="." mode="as-image"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="." mode="as-TeX"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="ltx:Math" mode="as-image">
<xsl:element name="img" namespace="{$html_ns}">
<xsl:call-template name="add_id"/>
<xsl:call-template name="add_attributes">
<xsl:with-param name="extra_style">
<xsl:if test="@imagedepth">
<xsl:value-of select="concat('vertical-align:-',@imagedepth,'px')"/>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
<xsl:attribute name="src">
<xsl:value-of select="f:url(@imagesrc)"/>
</xsl:attribute>
<xsl:if test="@imagewidth">
<xsl:attribute name="width">
<xsl:value-of select="@imagewidth"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@imageheight">
<xsl:attribute name="height">
<xsl:value-of select="@imageheight"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="@tex">
<xsl:attribute name="alt">
<xsl:value-of select="@tex"/>
</xsl:attribute>
</xsl:if>
</xsl:element>
</xsl:template>
<xsl:template match="ltx:Math" mode="as-TeX">
<xsl:element name="span" namespace="{$html_ns}">
<xsl:call-template name="add_id"/>
<xsl:call-template name="add_attributes">
</xsl:call-template>
<xsl:value-of select="@tex"/>
</xsl:element>
</xsl:template>
<!-- Top level generated m:math element gets id & class from ltx:Math
If the ltx:Math/m:math had any of those, they got lost! -->
<xsl:template match="ltx:Math" mode="as-MathML">
<xsl:element name="math" namespace="{$mml_ns}">
<!-- copy id, class, style from PARENT ltx:Math -->
<xsl:call-template name="add_id"/>
<xsl:call-template name="add_attributes"/>
<!-- but copy OTHER m:math attributes -->
<xsl:for-each select="m:math/@*">
<xsl:apply-templates select="." mode="copy-attribute"/>
</xsl:for-each>
<xsl:apply-templates select="m:math/*"/>
</xsl:element>
</xsl:template>
<!-- Copy MathML, as is -->
<xsl:template match="m:*">
<xsl:element name="{local-name()}" namespace="{$mml_ns}">
<xsl:for-each select="@*">
<xsl:apply-templates select="." mode="copy-attribute"/>
</xsl:for-each>
<xsl:choose>
<!-- If annotation-xml in a DIFFERENT namespace, copy as foreign markup -->
<xsl:when test="local-name()='annotation-xml'
and not(namespace-uri(child::*) = $MathML_NAMESPACE)">
<xsl:apply-templates mode='copy-foreign'/>
</xsl:when>
<!-- otherwise, process more mathml -->
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- If we hit MathML while copying "foreign" markup, resume as above -->
<xsl:template match="m:*" mode="copy-foreign">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
|