Нужен совет по использованию xsl выберите с содержанием и подстрокой - PullRequest
0 голосов
/ 22 марта 2012

Я думаю, у меня это работает, но мне нужен совет. Я хотел бы знать, является ли это хорошей установкой для требования, которое я имею. У меня есть требование применять различные правила преобразования к элементу на основе того, что содержится в этом элементе. Я пытался найти «xsl» и «выбрать», «содержит», «подстрока». Я не могу найти решение, применимое к этой ситуации.

Вот различные сценарии для этого элемента:

  1. Если это начинается с U, мне нужно все до '/'

    • Исходное значение: UJXXXXX / 001

    • Преобразовано: UJXXXXX

  2. Если все начинается с ECG_001, мне нужно все после ECG_001

    • Исходное значение: ECG_0012345678

    • Преобразовано: 12345678

  3. Если он не соответствует вышеуказанным критериям и содержит «/» дубль после «/»

    • Исходное значение: F5M / 12345678

    • Преобразовано: 12345678

  4. Если он не соответствует 1,2 или 3, просто дайте мне значение

    • Исходное значение: 12345678

    • Преобразовано: 12345678

Вот что у меня есть:

<xsl:variable name="CustomerPO">
        <xsl:choose>
            <xsl:when test="contains(substring(rma/header/CustomerPO,1,1), 'U')">
                <xsl:value-of select="substring-before(rma/header/CustomerPO,'/')"/>
            </xsl:when>
            <xsl:when test="contains(rma/header/CustomerPO, 'ECG_001')">
                <xsl:value-of select="substring-after(rma/header/CustomerPO,'ECG_001')"/>
            </xsl:when>
            <xsl:when test="contains(rma/header/CustomerPO, '/')">
                <xsl:value-of select="substring-after(rma/header/CustomerPO, '/')"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="rma/header/CustomerPO"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

Любые отзывы о потенциальных лазейках или более эффективный способ сделать это приветствуется.

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 марта 2012

Ваш XSLT выглядит нормально.Вы можете рассмотреть возможность использования функции starts-with вместо substring, мне легче читать, но я не уверен, что она быстрее.

0 голосов
/ 22 марта 2012

Мой собственный стиль - использовать правила шаблонов.

<xsl:template match="CustomerPO[starts-with(., 'U')]">
  <xsl:value-of select="substring-before(., '/')"/>
</xsl:template>

<xsl:template match="CustomerPO[starts-with(., 'ECG_001')]">
  <xsl:value-of select="substring-after(., 'ECG_001')"/>
</xsl:template>

и т.д.

...