Как проверить, что заданные значения, разделенные запятыми, имеют возрастающую числовую последовательность

Это огромная банка червей, потому что NULL может означать так много вещей:

  • Нет даты смерти, потому что человек все еще жив.
  • Нет сотового телефона номер, потому что мы не знаем, что это такое или даже если оно существует.
  • Нет номера социального страхования, потому что этот человек знает, что его нет.

Некоторые из их можно избежать путем нормализации, некоторые из них можно избежать из-за наличия значения в этом столбце («N / A»), некоторые из них могут быть смягчены за счет наличия отдельного столбца для объяснения присутствия NULL (" N / K "," N / A "и т. Д.).

Это также банда червей, потому что синтаксис SQL, необходимый для их поиска, отличается от синтаксиса ненулевых значений, к ним трудно присоединяться , и они обычно не включены в индексные записи.

Из-за прежней причины вы найдете случаи, когда нуль является неизбежным.

Из-за последней причины вы все равно должны сделать все возможное, чтобы свести к минимуму их число.

Несмотря на это, всегда используйте ограничения NOT NULL для защиты от нулей, где требуется значение.

0
задан DitaNewbie La 18 January 2019 в 17:04
поделиться

1 ответ

Предполагая, что вы ищете целочисленную последовательность, я думаю (в XSLT 3) это можно выразить как

  <xsl:template match="seq[let $items := tokenize(@value, ',\s+')!xs:integer(.) return every $p in 1 to count($items) satisfies $items[$p] = $items[1] + ($p - 1)]">
      <xsl:value-of select="@name"/><xsl:text> is an ascending numeric sequence
</xsl:text>
  </xsl:template>

Полный пример ( https://xsltfiddle.liberty-development.net / 6r5Gh2H )

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:mode on-no-match="shallow-skip"/>
  <xsl:strip-space elements="*"/>

  <xsl:output method="text"/>

  <xsl:template match="seq[let $items := tokenize(@value, ',\s+')!xs:integer(.) return every $p in 1 to count($items) satisfies $items[$p] = $items[1] + ($p - 1)]">
      <xsl:value-of select="@name"/><xsl:text> is an ascending numeric sequence
</xsl:text>
  </xsl:template>

</xsl:stylesheet>

В XSLT 2 с XPath 2 я не думаю, что вы позволили компактно выразить это в шаблоне соответствия, но вы, конечно, можете использовать переменную на уровне XSLT: [ 117]

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="2.0">

  <xsl:strip-space elements="*"/>

  <xsl:output method="text"/>

  <xsl:template match="seq[every $i in tokenize(@value, ',\s+') satisfies $i castable as xs:integer]">
    <xsl:variable name="items" select="for $item in tokenize(@value, ',\s+') return xs:integer($item)"/>
    <xsl:if test="every $p in 1 to count($items) satisfies $items[$p] = $items[1] + ($p - 1)">
      <xsl:value-of select="@name"/><xsl:text> is an ascending numeric sequence
</xsl:text>        
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

http://xsltransform.hikmatu.com/bFDb2BU

0
ответ дан Martin Honnen 18 January 2019 в 17:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: