2

我是一个完整的 XSL 新手,正在编写一个 XSL 文件来将可能出现在应用程序创建的输出日志中的许多不同的错误消息格式化为 CSV 格式。

这些输出日志中的可匹配标签可能会略有不同。例如,日志中的一个句子可能包含短语“Service Month/Year:”,但来自应用程序不同区域的另一个句子将包含“Svc Month/Yr:”。

有没有办法将该短语的这两种变体放在我的 XSL 的一行中?或者我是否必须重复整个 If 块,以及我想在其自己的 If 块中匹配的短语中的每个变体?

我尝试在此处发布被反引号包围的 XSL,但它在一个无法阅读的大块中运行。如果有人可以帮助解决这个问题,如果您告诉我如何使其可读,我很乐意发布。:-)

谢谢你。

4

1 回答 1

3

XSL 允许像其他语言一样组合条件语句。每个都不需要其 on 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>

用法:

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

分隔符可以是您想要的任何字符或字符。标记是要搜索的事物列表,每个事物之间都有分隔符。享受!

于 2009-05-29T17:41:22.173 回答