Проверьте, правильно ли сформирован документ перед анализом - PullRequest
3 голосов
/ 13 сентября 2010

Мне нужно проанализировать несколько тысяч документов 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="&#x0a;"/>
  </xsl:template>

</xsl:stylesheet>

Возможно ли сделать что-то подобное без ручной сортировки плохо сформированных документов перед началом преобразования?Может быть, у вас есть лучшее предложение для решения?

Ответы [ 3 ]

3 голосов
/ 13 сентября 2010

В настоящее время это лучше всего сделать из XSLT.

Это может быть сделано в XSLT, если вы предоставите в качестве внешнего параметра (<xsl:param>) для преобразования список всех имен файлов для обработки - тогда преобразование будет использовать стандартную функцию XPath 2.0 doc-available() и работают только с узлами документа, возвращенными этой функцией.

2 голосов
/ 13 сентября 2010

Вы можете использовать функцию doc-available, чтобы узнать, правильно ли сформирован документ.

2 голосов
/ 13 сентября 2010

Вы можете использовать TagSoup , чтобы убедиться, что все документы правильно сформированы.

Если вы используете Saxon, вы можете сделать TagSoup вашим парсером, добавив следующую опцию :

... вы можете использовать стандартный Saxon -x org.ccil.cowan.tagsoup.Parser, убедившись, что TagSoup находится на вашем пути к классам Java.

...