2016-05-18 1 views
0

これらのelsevierタグをmml:mathタグ​​に変換する方法はありますか?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

既存の変換コードを認識しますが指摘したかっないこと[XMLのDTDのエルゼビアDTD 5ファミリー](https://www.elsevier.com/__data /assets/pdf_file/0008/58409/ja50_tagbytag5-v1.1.pdf)には、あなたがリストする 'ce:chem'要素とMathMLの両方が含まれています。 – kjhughes

答えて

1

これを試してみてください:

XML:grouping機能が私のコードよりも良いを行うことができますce:chemコンテンツが改行とコメントテキストを持つべきではないことを確認し、私は要件を満たすために、このjsutを置きます。)

<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

ありがとうRudramuni!これは実際には動作しますが、disable-output-escaping = "yes">は<を '<'に変換しません。 – Viin

+0

@ViinQuileste、更新されたXSLTが掲載されました。ご確認ください。 –