我有这个XSLT:
<xsl:strip-space elements="*" />
<xsl:template match="math">
<img class="math">
<xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of
select="text()" /></xsl:attribute>
</img>
</xsl:template>
正在应用于此XML(请注意换行符):
<math>\text{average} = \alpha \times \text{data} + (1-\alpha) \times
\text{average}</math>
不幸的是,转换创建了这个:
<img
class="math"
src="http://latex.codecogs.com/gif.latex?\text{average} = \alpha \times \text{data} + (1-\alpha) \times 					\text{average}" />
注意空白字符文字。虽然它有效,但它非常混乱。我该如何防止这种情况?
答案 0 :(得分:4)
使用normalize-space()
功能是不够的,因为它离开了中间位置!
以下是一个简单而完整的解决方案:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="math">
<img class="math">
<xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of
select="translate(.,' 	 ', '')" /></xsl:attribute>
</img>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<math>\text{average} = \alpha \times \text{data} + (1-\alpha) \times
\text{average}</math>
产生了想要的正确结果:
<img class="math" src="http://latex.codecogs.com/gif.latex?\text{average}=\alpha\times\text{data}+(1-\alpha)\times\text{average}" />
请注意:
使用XPath 1.0 translate()
功能来删除所有不需要的字符。
此处无需使用replace()
功能 - 可能无法使用它,因为它仅在XPath 2.0中可用。
答案 1 :(得分:1)
我不确定你是如何生成文本的。但有两种方法:
您可以使用XSLT中提供的xsl:strip-spac e元素。
如果在XSLT过程中生成文本,那么另一种实现方法是使用字符串处理方法:normalize-space and replace methods。
答案 2 :(得分:1)
normalize-space函数剥离前导和尾随空格,并用单个空格替换空白字符序列。如果没有参数,它将对上下文节点的字符串值进行操作。
<xsl:template match="math">
<img class="math">
<xsl:attribute name="src">http://latex.codecogs.com/gif.latex?<xsl:value-of select="normalize-space()" /></xsl:attribute>
</img>
</xsl:template>
此外,您可以使用属性值模板而不是xsl:attribute
来简化样式表。
<xsl:template match="math">
<img class="math" src="http://latex.codecogs.com/gif.latex?{normalize-space()}" />
</xsl:template>