Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XSLT中的字符串修改_Java_Xml_Xslt - Fatal编程技术网

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

以下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 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(.) &lt; 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(.) &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>

01234567ABC
01234567:A
01234567:AB
对于强制(不鼓励)解决方案,请尝试以下方法:

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


那么……为什么你认为这应该被阻止?我的意思是,除了跳过第二个
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) &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>