Это довольно просто. Используйте
/A/B/C/E
[not(translate(@AnotherDate, '-:TZ', '')
>
translate(../@Since, '-:TZ', '')
)
]
Проверка на основе XSLT :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:copy-of select=
"/A/B/C/E
[not(translate(@AnotherDate, '-:TZ', '')
>
translate(../@Since, '-:TZ', '')
)
]
"/>
</xsl:template>
</xsl:stylesheet>
когда это преобразование применяется к предоставленному документу XML :
<A>
<B>
<C Since="2011-09-26T11:12:41.1383089Z">
<E Name="One" AnotherDate="2011-09-26T10:54:05.7025781Z"/>
<E Name="Two" AnotherDate="2011-09-26T11:54:05.7025781Z"/>
</C>
</B>
</A>
требуемый, правильный результат (выбран только один узел) копируется в вывод :
<E Name="One" AnotherDate="2011-09-26T10:54:05.7025781Z" />
Объяснение : Использование стандартной функции XPath 1.0 translate()
для удаления всех нецифровых символов из значений даты и времени, так что Остальные строки, состоящие только из цифр, можно затем корректно сравнивать как числа.