我在xslt脚本中使用了translate()函数,以便在呈现输出之前从重复元素中删除不需要的字符串。虽然翻译功能做它的工作,它是通过去除比它应该更多的字符影响这些元素的极少数,我不能为我的生命弄清楚为什么会发生的事情。
这是一个XML文档示例:
<?xml version="1.0" encoding="utf-8"?><books><book><title>Keep this text [remove this text]</title></book><book><title>Keep this text 2 [remove this text]</title></book><book><title>Keep this text 3 [remove this text]</title></book><book><title>Keep this text 4</title></book></books>
这是XSLT的一个非常基本的示例部分,它测试title元素中的[remove this text]字符串(此函数嵌套在for-each循环中):
<xsl:value-of select="translate(books/book/title, '[remove this text]', '')" />
这样可以成功删除不需要的字符串,并且在大多数情况下,可以保留前面的文本而不会出现问题。不幸的是,在少数问题中,title元素的最终输出将缺少几个字符(所有空白都被删除了),并且看起来像是“ kpptt2”,而不是“ Keep this text 2”。是否有人知道为什么会发生这种情况和/或产生类似本例的Fluke?谢谢!
答案 0 :(得分:0)
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*/text()">
<xsl:choose>
<xsl:when test="contains(., '[remove this text]')">
<xsl:value-of select="substring-before(., ' [remove this text]')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
1.0版使用
答案 1 :(得分:-1)
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//text()">
<xsl:value-of select="replace(., '\s\[\w+\s\w+\s\w+\]', '')"/>
</xsl:template>
请检查
答案 2 :(得分:-1)
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//text()">
<xsl:value-of select="replace(., '\s\[remove\sthis\stext\]', '')"/>
</xsl:template>
此代码特定的文字 '[移除此文本]' 删除