Использование :
not($vTest[not(. = $vPermitted)])
Проверка на основе XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vPermitted" as="xs:string*" select="'1', '2', '3', '278'"/>
<xsl:variable name="vTest1" as="xs:string*" select="'1', '2', '3'"/>
<xsl:variable name="vTest2" as="xs:string*" select="'1', '2', '3', '4'"/>
<xsl:template match="/">
<xsl:sequence select="not($vTest1[not(. = $vPermitted)])"/>
<xsl:sequence select="not($vTest2[not(. = $vPermitted)])"/>
</xsl:template>
</xsl:stylesheet>
Когда вышеуказанное преобразование применяется кВ любом XML-документе (не используется) два выражения XPath оцениваются и выводятся их правильные, требуемые результаты :
true false
Примечание :
Точноодно и то же выражение можно использовать даже в XPath 1.0 (XSLT 1.0), где нет понятия последовательности, но вместо этого можно использовать наборы узлов.
Объяснение :
Это « принцип двойного отрицания ». Этот принцип считается законом мышления в классической логике. Принцип был сформулирован Расселом и Уайтхедом в «Теории математики» как теорема логики высказываний в виде:
«Это принцип двойного отрицания, т.е. предложение эквивалентно ложности его отрицания. "
Наиболее оптимальная реализация - близко к O(N)
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vPermitted" as="map(xs:string, xs:boolean)" select=
"map{'1' : true(), '2' : true(), '3' : true(), '278' : true()}"/>
<xsl:variable name="vTest1" as="xs:string*" select="'1', '2', '3'"/>
<xsl:variable name="vTest2" as="xs:string*" select="'1', '2', '3', '4'"/>
<xsl:template match="/">
<xsl:sequence select="not($vTest1[not($vPermitted(.))])"/>
<xsl:sequence select="not($vTest2[not($vPermitted(.))])"/>
</xsl:template>
</xsl:stylesheet>
Когдавышеупомянутое преобразование применяется к любому документу XML (не используется), два выражения XPath оцениваются и их правильные, требуемые результаты выводятся :
true false
В то время как предыдущие выражения (включая выражения вв настоящее время принят ответ) все имеют временную сложность O(M*N)
, приведенное выше выражение XPath 3.1 использует предварительно заполненное (глобальное / созданное только один раз) map , так что любая проверка, если ключ существует, занимает постоянное время - , поэтому общая временная сложность этого алгоритма составляет O(N)
Здесь мы делаем разумное предположение, что XPathанВ gine используется хорошо оптимизированная реализация карт, например, основанная на хеш-таблицах