Модификация строки в XSLT

1

Каков эквивалентный код 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

Теги:
xslt

2 ответа

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>
  • 0
    Итак ... почему вы думаете, что это должно быть обескуражено? Я имею в виду, кроме как пропустить второй xsl:when , который также может быть пропущен в предоставленном java-коде ... Я не понимаю, почему это не должно поощряться.
  • 0
    Как это работает без определения переменной длины строки (Lkup_CODE)?
Показать ещё 7 комментариев
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]

Вы можете использовать один шаблон для случая равенства и меньше, так как они возвращают тот же результат. У вас могут быть разные, если вам нужно иметь дело по-разному с каждым случаем:

<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 для ваших функций:

  • Шары с 1 по 8 в Java: s.substring(0, 8) == в XPath: substring(s, 1, 8)
  • Шары 10-12 в Java: 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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню