Выражение XSLT, чтобы проверить, принадлежит ли переменная множеству элементов
У меня есть такой код:
<xsl:if test="$k='7' or $k = '8' or $k = '9'">
Есть ли способ поместить это выражение в форму, как, например, SQL
k IN (7, 8, 9)
Тай:)
2 ответа
Решение
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>
Если ваш процессор поддерживает 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>