我需要分析几千个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>
在转换开始之前没有手动整理非格式良好的文档,是否可以做这样的事情?也许你对解决方案有更好的建议?
答案 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函数告诉您文档是否格式正确。