2017-09-20 68 views
0

下午好,Saxon 9.8:EXPath File Module功能文件支持哪些模式:列表?

我正在使用Java Saxon 9.8.0.4。我想用其第三个“模式”参数使用EXPath文件模块函数“file:list”。但我怀疑,支持哪种模式。

我看过Saxon documentationEXPath documentation。但我不知道,Saxon 9.8.0.4支持哪些模式。支持正则表达式会很棒,但我知道对于大多数用户来说它是过度的。我尝试了几个盲目的测试,但只是*和?如EXPath documentation中定义的,wildchars适用于我。

是的,我可以非常容易地在for-each中进行regexp后处理,但要更多地了解list函数可能会有所帮助。

预先感谢您的帮助,斯捷潘

PS:我用例是让所有的文件没有扩展名(“测试”,而不是“的test.txt”)从大而深的目录结构和递归使用XSL-T 3.0处理所有匹配的文件。大多数这样的文件具有相同的文件名,因此我不能做“复制到一个文件夹”预处理萨克森的-s:目录-o:目录一次调用和调用Java(撒克逊)每个文件是可怕的时间高架。因此,我想将所有匹配的文件按顺序读取,并使用for-each(文件是文本文件并使用未解析文本读取它们)处理每个这样的序列项目。不,GAWK不是解决方案,因为我已经在XSL-T中实现了从XML到SQL的所有转换基础架构,因为95%的文件都是XML。

--ADDED代码及以下的解释:我的测试文件

例。

XML文件 “A.XML”:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="a.xsl"?> 
<root/> 

XSL-T文件 “a.xsl”:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:saxon="http://saxon.sf.net/" 
    xmlns:expathFile="http://expath.org/ns/file" 
    exclude-result-prefixes="xs saxon" 
    version="3.0"> 
    <xsl:output method="text" /> 
    <xsl:template match="/root"> 
    <xsl:variable name="list" select="expathFile:list('C:\temp\temp\test\', false(), '^.*$')"/> 
    <xsl:for-each select="$list"> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 
    </xsl:template> 

我的文件夹 “C:\ TEMP \ TEMP \测试\” 载6个测试文件:a.txt,b.txt,c.txt,e,f,g。

但在经过对“http://www.regexplanet.com/advanced/java/index.html”的联机Java RegExp测试程序的测试后,我发现问题完全在我身边,因为Java正则表达式与PCRE(Perl),sed和gawk正则表达式的行为有些不同。所以这是我的错,我需要学习Java正则表达式。

回答

1

撒克逊使用相同的码本模式作为在选择=“图案”过滤器中收集的URI,其在http://www.saxonica.com/documentation/index.html#!sourcedocs/collections

描述提取的相关细节:

中使用的图案select参数可以使用类似glob的语法,例如 示例*.xml选择扩展名为“xml”的所有文件。更一般地, 图案通过预先"^", 追加"$",通过".*"通过"\."替换".""*",和"?"通过".?", 转换为正则表达式,然后将其用于匹配出现在目录 的文件名使用Java正则表达式规则。因此,例如,您可以 编写?select=*.(xml|xhtml)以将文件与这两个 文件扩展名中的任意一个匹配。但请注意,URL 中使用的特殊字符(即URI的查询部分中允许使用的反斜杠和花括号不是 的字符)必须使用%HH 约定进行转义。例如,垂直条需要写成%7C。这个 转义可以使用encode-for-uri()函数来实现。

请注意,Saxon的collection()函数现在还支持URI中的匹配=模式,其中模式是标准XPath 3.1正则表达式。

+0

我非常抱歉,但即使经过大量尝试,我也无法使其工作。我的代码是: 当我尝试更改'*'为例如'。*'或'^。* $'它仍然不起作用。 –

+0

我担心wiki系统可能损坏了您的示例代码。请在反引号之间再次输入。 –