我在样式表中使用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>
答案 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),并获得完全相同的正确结果。