如何使用不区分大小写的子字符串

时间:2016-05-19 19:35:59

标签: xml xslt xpath

嗨我有字段<name>ATTN Dani</name>,我需要移除ATTN,但它来ATTN有时attn或Attn甚至ATtn我怎么能做这个子串我已经完成了下面的xslt但它影响了值。我不希望价值受到影响

<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:pfx4="http://xmlns.oracle.com/apps/otm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <PARTNER_INBOUND_V2>

        <xsl:choose>

                    <xsl:when test="starts-with(upper-case(//root/name), 'ATTN')">
                        <IS_ACTIVE>Working</IS_ACTIVE>
                    <test><xsl:value-of select="normalize-space(substring-after(upper-case(//root/name),'ATTN'))"/></test>
                    </xsl:when>
                    <xsl:otherwise>
                        <IS_ACTIVE>Y</IS_ACTIVE>
                    </xsl:otherwise>

        </xsl:choose>
            </PARTNER_INBOUND_V2>
    </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

转换为大写/小写通常使用XSLT 1.0中的translate方法完成。它通常不是100%合适,因为你必须准确指定切换大小写的字母,这可能因语言而异,但对于与语言无关的应用程序,它很好,你甚至可以减少你需要的东西:

substring-after(translate(.,'atn','ATN'), 'ATTN')

但是,在您的情况下,这可能会有轻微的风险,因为您还会在其后的任何内容中转换字母。

实际上,你可能需要

<xsl:if test="translate(substring(//root/name,1,5),'atn','ATN') = 'ATTN '">
  <xsl:value-of select="substring-after(//root/name,' ')"/>
</xsl:if>

注意你要比较的字符串末尾的空格,这只是确保'ATTN'之后有一个空格,然后你可以在该空格后面的子字符串来获得你需要的东西。 / p>

答案 1 :(得分:0)

如果您知道该字符串以“ATTN”开头但不确定该案例,您可以使用:

<xsl:value-of select="substring(name, 6)" />

提取后续子字符串。