0

XML を HTML に変換するスタイルシートで XSLT 2.0 要素の analyze-string を使用します。具体的には、化学式の下付き文字の文字列エンコーディングを HTML の下付き文字に変換するために使用します。したがって、結果は文字列であり、マークアップが埋め込まれた ap または td 要素に入ります。

変換は H 2 O のような出力を生成するはずですが、実際には HTML に改行を挿入します。

H
<sub>2</sub>O

この改行は、ブラウザーによって (正しく) スペースとして解釈されます。

H 2 O

これは醜いです。

改行を削除する方法はありますか? analyze-string 要素全体を 1 行にまとめてみましたが、うまくいきません。

入力は次のようになります

<OrdinaryStructralFormula>H$_2$O</OrdinaryStructuralFormula>

単純な場合と

<OrdinaryStructralFormula>C$_2$OH$_5$$^-</OrdinaryStructuralFormula>

より複雑なもののために。通常、添え字パターンは複数回一致する可能性があり、文字列の途中または最後にある可能性があることに注意してください。パターンはまた、電荷の表記法に一致し、除去する必要があります: 2 番目の例の最後の $^- ビットです。

XSLT プロセッサは Saxon 9.4 で、XSLT テンプレートはこれに従います。

<xsl:template name="formula">
  <xsl:param name="formula"/>
  <xsl:if test="$formula">
    <xsl:variable name="f" select="translate($formula, '$', '')"/>
    <xsl:analyze-string select="$f" regex="(_)(\d+)|(\^)\d*\+|(\^)\d*\-">
      <xsl:matching-substring>
        <xsl:if test="regex-group(1)='_'">
          <sub><xsl:value-of select="regex-group(2)"/></sub>
        </xsl:if>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </xsl:if>
</xsl:template>
4

1 に答える 1

0

報告された結果を再現できません

この変換(これはあなたが私たちに与えるべきものですが、あなたはテンプレートを提供しただけです):

<xsl:stylesheet version="2.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="/">
     <xsl:call-template name="formula">
       <xsl:with-param name="formula" select="/*"/>
     </xsl:call-template>
    </xsl:template>

    <xsl:template name="formula">
      <xsl:param name="formula"/>

      <xsl:if test="$formula">
        <xsl:variable name="f" select="translate($formula, '$', '')"/>
        <xsl:analyze-string select="$f" regex="(_)(\d+)|(\^)\d*\+|(\^)\d*\-">
          <xsl:matching-substring>
            <xsl:if test="regex-group(1)='_'">
              <sub><xsl:value-of select="regex-group(2)"/></sub>
            </xsl:if>
          </xsl:matching-substring>
          <xsl:non-matching-substring>
            <xsl:value-of select="."/>
          </xsl:non-matching-substring>
        </xsl:analyze-string>
      </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Saxon 9.1.05を使用して次のXMLドキュメントに適用した場合:

<formula>H$_2$O</formula>

必要な正しい結果を生成します

H<sub>2</sub>O

同じ変換が2番目のXMLドキュメントに適用される場合

<OrdinaryStructuralFormula>C$_2$OH$_5$$^-</OrdinaryStructuralFormula>

ここでも、必要な正しい結果が生成されます。

C<sub>2</sub>OH<sub>5</sub>

:他の2つのXSLT 2.0プロセッサ(XQSharp(XMLPrime)とAltovaXML(XML-SPY))で同じ変換を実行したところ、まったく同じ正しい結果が得られました。

于 2012-07-17T04:39:15.163 に答える