XSL Rookie -Могу ли я сделать XSL, который соответствует «этой фразе», также соответствует «ths fraze», не повторяя весь блок «если тест»? - PullRequest
2 голосов
/ 29 мая 2009

Я новичок в XSL, пишу файл XSL для форматирования множества различных сообщений об ошибках, которые могут появиться в выходном журнале, созданном приложением, в формате CSV.

В соответствующих тегах в этих выходных журналах могут наблюдаться небольшие различия. Например, одно предложение в журнале может содержать фразу «Сервисный месяц / год:», а другое предложение из другой области приложения будет содержать «Svc Month / Yr:» вместо этого.

Есть ли способ поместить оба варианта этой фразы в одну строку моего XSL? Или мне нужно повторить весь блок If, с каждым вариантом фразы, с которым я хочу сопоставить, в своем собственном блоке If?

Я попытался опубликовать XSL здесь, окруженный обратными чертами, но он работает все вместе в одном большом комке, который невозможно прочитать. Если кто-то может помочь с этим вопросом, я буду рад опубликовать его, если вы подскажете, как сделать его читабельным. : -)

Спасибо.

1 Ответ

3 голосов
/ 29 мая 2009

XSL позволяет комбинировать условные операторы, как и другие языки. Каждый из них не требует своего заявления if. Вы думали что-то в этом роде?

<xsl:choose>
  <xsl:when test="contains(text(), 'Service Month/Year:')
               or contains(text(), 'Svc Month/Yr:')
               ">
    <!-- do something -->
  </xsl:when>
</xsl:choose>

Имейте в виду, что xml / xsl чувствительны к регистру. Чтобы сделать его более гибким, он еще более многословен:

<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>
<xsl:choose>
  <xsl:when test="contains(translate(text(), $upper, $lower), 'service month/year:')
               or contains(translate(text(), $upper, $lower), 'svc month/yr:')
               ">
    <!-- do something -->
  </xsl:when>
</xsl:choose>

РЕДАКТИРОВАТЬ: И еще лучший ответ, который я взбил

<xsl:template name="containsToken">
  <xsl:param name="inputString"/>
  <xsl:param name="tokens"/>
  <xsl:param name="delimiter"/>
  <xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'"/>
  <xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

  <xsl:choose>
    <xsl:when test="contains($tokens, $delimiter)">
      <xsl:variable name="token">
        <xsl:value-of select="substring-before($tokens, $delimiter)"/>
      </xsl:variable>
      <xsl:choose>
        <xsl:when test="contains(translate($inputString, $upper, $lower), translate($token, $upper, $lower))">
          <xsl:text>True</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <!-- loop -->
          <xsl:call-template name="containsToken">
            <xsl:with-param name="inputString" select="$inputString"/>
            <xsl:with-param name="tokens" select="substring-after($tokens, $delimiter)"/>
            <xsl:with-param name="delimiter" select="$delimiter"/>
          </xsl:call-template>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <xsl:choose>
        <xsl:when test="contains(translate($inputString, $upper, $lower), translate($tokens, $upper, $lower))">
          <xsl:text>True</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>False</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

Usage:

<xsl:variable name="found">
  <xsl:call-template name="containsToken">
    <xsl:with-param name="inputString" select="text()"/>
    <xsl:with-param name="tokens" select="'Service Month/Year:|Svc Month/Yr:'"/>
    <xsl:with-param name="delimiter" select="'|'"/>
  </xsl:call-template>
</xsl:variable>

<xsl:if test="$found = 'True'">
  <!-- process -->
</xsl:if>

Разделителем может быть любой символ или символ, который вы хотите. Жетоны - это список вещей для поиска с разделителем между ними. Наслаждайтесь!

...