Еще одно решение:)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Number[not(.*.+1)]"/>
</xsl:stylesheet>
, когда это преобразование применяется к следующему документу XML :
<t>
<Number>111111</Number>
<Number>123123+</Number>
<Number>222222</Number>
<Number>222222+</Number>
</t>
желаемый, правильный результат получается :
<t>
<Number>111111</Number>
<Number>222222</Number>
</t>
Пояснение : Все Number
элементов для которых выражение:
not(.*.+1)
являетсяtrue()
отфильтровываются по простому правилу шаблона:
<xsl:template match="Number[not(.*.+1)]"/>
Это возможно, только если строковое значение элемента Number
не может быть преобразовано в число.В этом случае .*.+1
оценивается как NaN
, а boolean(NaN)
по определению false()
.
Если строковое значение элемента Number
можно преобразовать в число $ num, тогда приведенное вышеВыражение эквивалентно:
not($num*$num+1)
и $num*$num+1 >= 1
для любого числа $num
, поэтому boolean(.*.+1)
в этом случае всегда равно true()
.