XSLT中的字符串修改

时间:2014-07-07 14:35:05

标签: java xml xslt

以下Java代码的等效XSLT代码是什么?

    if (s.length() > 11) {
        return s.substring(0, 8) + s.substring(9, 12);
    }
    if (s.length() == 11) {
        return s;
    }
    return s;

我必须同样检查一个名为Lkup_CODE的字段:

<Identifier>
    <xsl:value-of select="Lkup_CODE" />
</Identifier>

此致

Chaitu

2 个答案:

答案 0 :(得分:2)

对于命令式(并且气馁)解决方案,请尝试以下方法:

<xsl:choose>
  <xsl:when test="string-length(Lkup_CODE) &gt; 11">
    <xsl:value-of select="concat(substring($Lkup_CODE, 1, 8), substring(Lkup_CODE, 10, 3))"/>
  </xsl:when>
  <xsl:when test="string-length(Lkup_CODE) = 11">
    <xsl:value-of select="Lkup_CODE"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="Lkup_CODE"/>
  </xsl:otherwise>
</xsl:choose>

答案 1 :(得分:1)

这是一个测试用例。假设您使用如下来源:

<Codes>
    <Lkup_CODE>01234567:ABCDEF</Lkup_CODE> <!-- string length > 11  -->
    <Lkup_CODE>01234567:A</Lkup_CODE>      <!-- string length < 11  -->
    <Lkup_CODE>01234567:AB</Lkup_CODE>     <!-- string length == 11 -->
</Codes>

您可以使用Lkup_CODE的不同模板处理每个案例,匹配其内容的字符串长度。例如,此XPath表达式将匹配长度恰好为11个字符的代码(最后一个):

Lkup_CODE[string-length(.)=11]

您可以将单个模板用于相等的情况,使用less-than,因为它们返回相同的结果。如果您需要针对每种情况采取不同的处理方式,您可以使用不同的方法:

<xsl:template match="Lkup_CODE[string-length(.)=11]">
    <Identifier>
        <xsl:value-of select="."/>
    </Identifier>
</xsl:template>

<xsl:template match="Lkup_CODE[string-length(.) &lt; 11]">
    <Identifier>
        <xsl:value-of select="."/>
    </Identifier>
</xsl:template>

对于大于的情况,您必须处理子字符串。在XPath中,字符串从1开始,substring()函数包括第一个位置和之后要提取的字符数而不是位置,如Java中所示。这将是您的函数的Java / XPath映射:

  • Java中的字符1到8:s.substring(0, 8) ==在XPath中:substring(s, 1, 8)
  • Java中的字符10到12:s.substring(9, 13) ==在XPath中:substring(s, 10, 3)

此模板将处理该条件:

<xsl:template match="Lkup_CODE[string-length(.) &gt; 11]">
    <Identifier>
        <xsl:value-of select="concat(substring(.,1,8),substring(., 10,3))"/>
    </Identifier>
</xsl:template>

这是我在本答案开头所包含的测试用例的完整样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:template match="Codes">
        <Result>
            <xsl:apply-templates/>
        </Result>
    </xsl:template>

    <xsl:template match="Lkup_CODE[string-length(.)=11]">
        <Identifier>
            <xsl:value-of select="."/>
        </Identifier>
    </xsl:template>

    <xsl:template match="Lkup_CODE[string-length(.) &lt; 11]">
        <Identifier>
            <xsl:value-of select="."/>
        </Identifier>
    </xsl:template>

    <xsl:template match="Lkup_CODE[string-length(.) &gt; 11]">
        <Identifier>
            <xsl:value-of select="concat(substring(.,1,8),substring(., 10,3))"/>
        </Identifier>
    </xsl:template>

</xsl:stylesheet>

它将产生以下结果:

<Result>
    <Identifier>01234567ABC</Identifier> <!-- modified because > 11 -->
    <Identifier>01234567:A</Identifier>  <!-- unmodified because < 11 -->
    <Identifier>01234567:AB</Identifier> <!-- unmodified because = 11 -->
</Result>