Каков эквивалентный код XSLT для кода Java ниже?
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
Для императивного (и обескураженного) решения попробуйте следующее:
<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>
Вот тестовый пример. Предполагая, что вы используете источник, такой как:
<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]
Вы можете использовать один шаблон для случая равенства и меньше, так как они возвращают тот же результат. У вас могут быть разные, если вам нужно иметь дело по-разному с каждым случаем:
<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>
xsl:when
, который также может быть пропущен в предоставленном java-коде ... Я не понимаю, почему это не должно поощряться.