使用XSLT 2.0 analyze-string消除换行符

时间:2012-07-16 11:48:24

标签: xslt-2.0

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

转换应该产生类似H 2 O的输出但实际上在HTML中插入一个换行符:

H
<sub>2</sub>O

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

ħ <子> 2 0

这很难看。

有没有办法删除换行符?我已经尝试将整个analyze-string元素放在一行上,但这不起作用。

输入类似于

<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>

1 个答案:

答案 0 :(得分: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),并获得完全相同的正确结果。