0

我在将 XML 转换为 HTML 的样式表中使用 XSLT 2.0 元素分析字符串;具体来说,我用它来将化学公式中下标的字符串编码转换为 HTML 下标。因此,结果是一个字符串,进入 ap 或 td 元素,带有嵌入的标记。

转换应该产生像 H 2 O 这样的输出,但实际上在 HTML 中插入了一个换行符:

H
<sub>2</sub>O

并且这个中断(正确地)被浏览器解释为一个空格:

H 2 O

这是丑陋的。

有没有办法删除换行符?我尝试将整个分析字符串元素放在一行上,但这不起作用。

输入将类似于

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

对于一个简单的案例和

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

对于一个更复杂的。请注意,在一般情况下,下标模式可以匹配多次,并且可以位于字符串的中间或末尾。该模式还必须匹配并消除任何收费符号:第二个示例末尾的 $^- 位。

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

当对第二个 XML 文档应用相同的转换时

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

再次产生想要的正确结果:

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

请注意:我用另外两个 XSLT 2.0 处理器运行了相同的转换:XQSharp (XMLPrime) 和 AltovaXML (XML-SPY),得到了完全相同的正确结果。

于 2012-07-17T04:39:15.163 回答