在解析之前测试文档是否格式良好

时间:2010-09-13 12:18:25

标签: xml xslt xslt-2.0

我需要分析几千个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 个答案:

答案 0 :(得分:3)

目前最好用XSLT完成。

如果你在转换中提供了一个exrternal参数(<xsl:param>)来处理所有要处理的文件名列表,那么可以在XSLT中完成 - 然后转换将使用标准的XPath 2.0函数doc-available(并且仅对此函数返回的文档节点进行操作。

答案 1 :(得分:2)

您可以使用TagSoup来确保所有文档格式正确。

如果您使用的是Saxon,you can make TagSoup your parser by adding the following option

  

...您可以使用标准的Saxon -x org.ccil.cowan.tagsoup.Parser选项,   确保TagSoup打开后   你的Java类路径。

答案 2 :(得分:2)

您可以使用doc-available函数告诉您文档是否格式正确。