以下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
答案 0 :(得分:2)
对于命令式(并且气馁)解决方案,请尝试以下方法:
<xsl:choose>
<xsl:when test="string-length(Lkup_CODE) > 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(.) < 11]">
<Identifier>
<xsl:value-of select="."/>
</Identifier>
</xsl:template>
对于大于的情况,您必须处理子字符串。在XPath中,字符串从1开始,substring()
函数包括第一个位置和之后要提取的字符数而不是位置,如Java中所示。这将是您的函数的Java / XPath映射:
s.substring(0, 8)
==在XPath中:substring(s, 1, 8)
s.substring(9, 13)
==在XPath中:substring(s, 10, 3)
此模板将处理该条件:
<xsl:template match="Lkup_CODE[string-length(.) > 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(.) < 11]">
<Identifier>
<xsl:value-of select="."/>
</Identifier>
</xsl:template>
<xsl:template match="Lkup_CODE[string-length(.) > 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>