Выражение XSLT для проверки, принадлежит ли переменная множеству элементов - PullRequest
17 голосов
/ 17 июня 2009

У меня есть такой код:

  <xsl:if test="$k='7' or $k = '8' or $k = '9'">

Есть ли способ поместить это выражение в форму, например, SQL

   k IN (7, 8, 9)

Ты:)

Ответы [ 2 ]

22 голосов
/ 17 июня 2009

XSLT / XPath 1.0:

<!-- a space-separated list of valid values -->
<xsl:variable name="list" select="'7 8 9'" />

<xsl:if test="
  contains( 
    concat(' ', $list, ' '),
    concat(' ', $k, ' ')
  )
">
  <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
</xsl:if>

При необходимости вы можете использовать другие разделители.

В XSLT / XPath 2.0 вы можете сделать что-то вроде:

<xsl:variable name="list" select="fn:tokenize('7 8 9', '\s+')" />

<xsl:if test="fn:index-of($list, $k)">
  <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
</xsl:if>

Если вы можете использовать структуру документа для определения списка, вы можете сделать:

<!-- a node-set defining the list of currently valid items -->
<xsl:variable name="list" select="/some/items[1]/item" />

<xsl:template match="/">
  <xsl:variable name="k" select="'7'" />

  <!-- test if item $k is in the list of valid items -->
  <xsl:if test="count($list[@id = $k])">
    <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
  </xsl:if>
</xsl:template>
5 голосов
/ 07 января 2014

Если ваш процессор поддерживает XPath 2.0, тогда вы можете сравнить $k с такой последовательностью:

<xsl:if test="$k = (7, 8, 9)">

Вы даже можете использовать оператор диапазона в этом конкретном случае:

<xsl:if test="$k = (7 to 9)">

Нет необходимости явного приведения типов. Протестировано с Saxon-HE 9.8.0.12N (XSLT 3.0).

Пример XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <node>5</node>
    <node>6</node>
    <node>7</node>
    <node>9</node>
    <node>10</node>
    <node>79</node>
    <node>8</node>
</root>

стилевой:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="root">
        <xsl:copy>
            <xsl:apply-templates select="node"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="node">
        <xsl:variable name="k" select="text()"/>
        <xsl:if test="$k = (7 to 9)">
            <xsl:copy-of select="."/>
        </xsl:if>
    </xsl:template>

</xsl:stylesheet>

Результат:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <node>7</node>
   <node>9</node>
   <node>8</node>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...