我需要分析几千个 XML文档,看看它们中是否包含某个构造.问题是某些文档不包含格式良好的XML. 基本思想是使用fn:collection()并在返回的节点内搜索.但这只有在集合中的所有文档都很好
基本思想是使用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>
是否有可能做这样的事情而不需要在转换开始之前手动整理非格式良好的文档?也许你对解决方案有更好的建议?
目前,最好用XSLT完成.它可以在XSLT中完成,如果你提供exrternal参数(< xsl:param>)到转换一个要处理的所有文件名的列表 – 那么转换将使用标准的XPath 2.0函数doc-available()和仅对此函数返回的文档节点进行操作.