Java XSLT中的字符串修改
以下Java代码的等效XSLT代码是什么Java XSLT中的字符串修改,java,xml,xslt,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\u code的字段: <Identifier> <xsl:value-of se
if (s.length() > 11) {
return s.substring(0, 8) + s.substring(9, 12);
}
if (s.length() == 11) {
return s;
}
return s;
我必须在上面检查一个名为:Lkup\u code
的字段:
<Identifier>
<xsl:value-of select="Lkup_CODE" />
</Identifier>
问候,
Chaitu这里是一个测试用例。假设您使用以下来源:
<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>
您可以对等式和小于使用单个模板,因为它们返回相同的结果。如果您需要以不同的方式处理每种情况,您可以使用不同的:
<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: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>
01234567ABC
01234567:A
01234567:AB
对于强制(不鼓励)解决方案,请尝试以下方法:
<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>
那么……为什么你认为这应该被阻止?我的意思是,除了跳过第二个xsl:when
,在提供的java代码中也可以跳过它。。。我不明白为什么不鼓励这样做。在不定义可变字符串长度(Lkup_代码)的情况下,它是如何工作的?用户,我假设您的XML中有一个Lkup_代码
元素,并且在处理过程中它在范围内(就像标识符
示例)。否则,只需使用一个变量来选择它,
,并在Lkup\u code
前面加上一个$
,即可使用变量而不是元素。@Tobias,因为它促进了在声明式编程语言中不必要地使用命令式习惯用法。尽可能使用模板而不是
,
,
,等等。XSLT中的控制流语句有一些有效的案例,但我不认为这是其中之一。我认为这正是我宁愿使用命令式构造的操作类型。。。这只是对字符串的一个简单操作,为什么我要为此编写三个模板。。。
<Result>
<Identifier>01234567ABC</Identifier> <!-- modified because > 11 -->
<Identifier>01234567:A</Identifier> <!-- unmodified because < 11 -->
<Identifier>01234567:AB</Identifier> <!-- unmodified because = 11 -->
</Result>
<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>