2016-05-18 1 views
0

Есть ли способ конвертировать эти теги elsevier в mml: math tags?ce: химический тег для преобразования в mml: математика

<ce:chem>PEG<ce:inf>BOUND</ce:inf> 
<ce:hsp sp="0.25"/>=<ce:hsp sp="0.25"/>PEG<ce:inf>TOT</ce:inf> 
<ce:hsp sp="0.25"/>-<ce:hsp sp="0.25"/>PEG<ce:inf>FINAL</ce:inf> 
</ce:chem> 
+0

Не в курсе любого существующего кода преобразования, но хотел бы отметить, что [Elsevier DTD 5 Семейство XML ОТД] (https://www.elsevier.com/__data /assets/pdf_file/0008/58409/ja50_tagbytag5-v1.1.pdf) включает в себя как элементы 'ce: chem', которые вы перечисляете, так и MathML. – kjhughes

ответ

1

Попробуйте это:

XML: (. Убедитесь, что ce:chem содержания не должен иметь разрывов строк и текст комментария grouping функции могут сделать лучше, чем мой код, но я поместил это этого нужно просто для удовлетворения требования)

<article xmlns:ce="http://www.elsevier.com/xml/common/dtd" 
xmlns:sb="http://www.elsevier.com/xml/common/struct-bib/dtd" 
xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:mml="http://www.w3.org/1998/Math/MathML"> 
<p> 
<ce:chem>PEG<ce:inf>BOUND</ce:inf><ce:hsp sp="0.25"/>=<ce:hsp sp="0.25"/>PEG<ce:inf>TOT</ce:inf><ce:hsp sp="0.25"/>-<ce:hsp sp="0.25"/>PEG<ce:inf>FINAL</ce:inf>A<ce:sup>2</ce:sup></ce:chem> 
</p> 
</article> 

XSLT 2.0: (последняя XSLT)

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ce="http://www.elsevier.com/xml/common/dtd" 
xmlns:sb="http://www.elsevier.com/xml/common/struct-bib/dtd" 
xmlns:xlink="http://www.w3.org/1999/xlink" 
xmlns:mml="http://www.w3.org/1998/Math/MathML" 
xmlns:ja="http://www.elsevier.com/xml/ja/dtd"> 

<xsl:output method="xml" indent="yes"/> 
<xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates/></xsl:copy></xsl:template> 

<xsl:template match="ce:chem"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()[not(self::ce:inf)][not(self::ce:sup)] | @*" /> 
    </xsl:copy> 
</xsl:template> 

<xsl:key name="ksub" match="ce:inf" use="generate-id(preceding-sibling::node()[1][self::text()])"/> 
<xsl:key name="ksup" match="ce:sup" use="generate-id(preceding-sibling::node()[1][self::text()])"/> 

<xsl:template match="ce:chem/text()"> 
    <xsl:choose> 
     <xsl:when test="following-sibling::node()[1][name()='ce:inf']"> 
      <xsl:element name="ce:msub"> 
       <xsl:call-template name="tempNameElements"/> 
      <xsl:apply-templates select="key('ksub', generate-id())" /> 
      </xsl:element> 
     </xsl:when> 
     <xsl:when test="following-sibling::node()[1][name()='ce:sup']"> 
      <xsl:element name="ce:msup"> 
       <xsl:call-template name="tempNameElements"/> 
      <xsl:apply-templates select="key('ksup', generate-id())" /> 
      </xsl:element> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="tempNameElements"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="ce:hsp"> 
    <xsl:element name="mml:mspace"> 
     <xsl:attribute name="width"><xsl:value-of select="@sp"/></xsl:attribute> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="ce:inf"> 
    <xsl:for-each select="node()"> 
     <xsl:call-template name="tempNameElements"/> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="ce:sup"> 
    <xsl:for-each select="node()"> 
     <xsl:call-template name="tempNameElements"/> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template name="tempNameElements"> 
    <xsl:choose> 
     <xsl:when test="starts-with(replace(self::text(), '([A-z]+)', 'A'), 'A')"> 
      <xsl:element name="mml:mi"><xsl:value-of select="."/></xsl:element> 
     </xsl:when> 
     <xsl:when test="starts-with(replace(self::text(), '([0-9]+)', '9'), '9')"> 
      <xsl:element name="mml:mn"><xsl:value-of select="."/></xsl:element> 
     </xsl:when> 
     <xsl:when test="matches(self::text(), '^(\(|\[|\{|=|\-)$')"> 
      <xsl:element name="mml:mo"><xsl:value-of select="."/></xsl:element> 
     </xsl:when> 
     <xsl:otherwise><xsl:element name="mml:mtext"><xsl:value-of select="."/></xsl:element></xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 

Результат:

<?xml version="1.0" encoding="UTF-8"?> 
<article xmlns:ce="http://www.elsevier.com/xml/common/dtd" 
    xmlns:sb="http://www.elsevier.com/xml/common/struct-bib/dtd" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:mml="http://www.w3.org/1998/Math/MathML"> 
    <p> 
    <ce:chem> 
    <ce:msub> 
     <mml:mi>PEG</mml:mi> 
     <mml:mi>BOUND</mml:mi> 
    </ce:msub> 
    <mml:mspace width="0.25"/> 
    <mml:mo>=</mml:mo> 
    <mml:mspace width="0.25"/> 
    <ce:msub> 
     <mml:mi>PEG</mml:mi> 
     <mml:mi>TOT</mml:mi> 
    </ce:msub> 
    <mml:mspace width="0.25"/> 
    <mml:mo>-</mml:mo> 
    <mml:mspace width="0.25"/> 
    <ce:msub> 
     <mml:mi>PEG</mml:mi> 
     <mml:mi>FINAL</mml:mi> 
    </ce:msub> 
    <ce:msup> 
     <mml:mi>A</mml:mi> 
     <mml:mn>2</mml:mn> 
    </ce:msup> 
    </ce:chem> 
    </p> 
</article> 
+0

Спасибо Рудрамуни! Это действительно работает, но disable-output-escaping = "yes"> не конвертирует < в '<'. – Viin

+0

@ViinQuileste, обновленный XSLT отправлен, пожалуйста, проверьте. –