Мне нужно проанализировать несколько тысяч документов XML, чтобы увидеть, содержит ли некоторые из них определенную конструкцию.Проблема в том, что некоторые документы не содержат правильно сформированный XML.
Основная идея заключалась в том, чтобы использовать fn:collection()
и возвращать результаты поиска внутри узлов.Но это работает только в том случае, если все документы в собрании правильно сформированы.
Можно ли сделать что-то подобное, но только проанализировать правильно оформленные документы?
Это мой XSLT, упрощенный, который работает, если все документы в $dir
правильно сформированы:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:variable name="dir" as="xs:string">file:/c:/path/to/files/</xsl:variable>
<xsl:variable name="files" select="concat($dir, '?select=*.xml')" as="xs:string"/>
<xsl:template match="/">
<xsl:variable name="docs" select="collection($files)"/>
<xsl:variable name="names" select="
for $i in $docs return
distinct-values($i//*[exists(@an-attribute-to-find)]/local-name())"/>
<xsl:value-of select="distinct-values($names)" separator="
"/>
</xsl:template>
</xsl:stylesheet>
Возможно ли сделать что-то подобное без ручной сортировки плохо сформированных документов перед началом преобразования?Может быть, у вас есть лучшее предложение для решения?