XSLT翻译问题

时间:2019-02-02 01:15:57

标签: xml xslt

我在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?谢谢!

3 个答案:

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

此代码特定的文字 '[移除此文本]' 删除