3

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

是否可以在转换开始之前不手动整理格式不正确的文档来做这样的事情?也许您对解决方案有更好的建议?

4

3 回答 3

3

目前,这最好在 XSLT 之外完成。

如果您将要处理的所有文件名的列表作为外部参数 ( ) 提供给转换,则可以在 XSLT 中完成<xsl:param>- 然后转换将使用标准 XPath 2.0 函数 doc-available() 并仅在文档节点上操作由该函数返回。

于 2010-09-13T13:17:06.467 回答
2

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

如果您使用的是 Saxon,则可以通过添加以下选项使 TagSoup 成为您的解析器

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

于 2010-09-13T12:45:51.070 回答
2

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

于 2010-09-13T12:53:46.483 回答