2012-07-16 35 views
0

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

变换是应该产生如H O,但实际上输出插入在HTML的线断:

H 
<sub>2</sub>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> 
+1

请考虑发布完整的,最小的但是格式良好的输入XML,XSLT代码,期望输出,当前输出的样本以展示问题并允许我们重现它。在所谓的输入是 H $ _2 $ O的情况下,其中开始标记名称与结束标记名称不同,无法分辨出您得到的空白是什么原因,而我在发布的XSLT片段中没有看到任何内容可以解释它。 – 2012-07-16 12:20:36

回答

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> 

当下面的XML文档与撒克逊05年9月1日适用于:

<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),并得到完全相同的正确结果。