下午好,
我正在使用Java Saxon 9.8.0.4。我想使用EXPath文件模块功能“file:list”及其第三个“pattern”参数。但我怀疑,支持哪种模式。
我同时阅读了Saxon documentation和EXPath documentation。但我不知道,Saxon 9.8.0.4支持哪些模式。支持正则表达式会很棒,但据我所知,这对大多数用户来说都是过度的。我尝试了几次盲测,但只是*和?我在EXPath documentation中的定义中为我工作。
是的,我可以很容易地在for-each中进行regexp后处理,但要了解更多有关列表功能的信息可能有所帮助。
提前感谢您的帮助,Stepan
P.S:我的用例是从大型和深层目录结构中递归获取所有没有扩展名的文件(“test”而不是“test.txt”),并使用XSL-T 3.0处理所有匹配的文件。大多数此类文件具有相同的fileName,因此我无法对Saxon的-s进行“复制到一个文件夹”预处理:目录-o:目录一次调用并且每个文件调用Java(Saxon)都是很糟糕的时间高架。因此,我想将所有匹配的文件按顺序读取并使用for-each处理此类序列的每个项目(文件是文本的,我使用未解析的文本读取它们)。不,GAWK不是解决方案,因为我已经在XSL-T中拥有从XML到SQL的所有转换基础架构,因为95%的文件都是XML。
- 下面添加的代码和说明:
我的测试文件示例。
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 \ test \”包含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正则表达式。
答案 0 :(得分:1)
Saxon对此模式使用与集合URI中select =“pattern”中的过滤器相同的代码,http://www.saxonica.com/documentation/index.html#!sourcedocs/collections
提取相关细节:
select参数中使用的模式可以使用类似glob的语法 示例
*.xml
选择扩展名为“xml”的所有文件。更普遍, 通过前置"^"
将模式转换为正则表达式, 附加"$"
,"."
替换"\."
,"*"
替换".*"
,"?"
替换".?"
, 然后它用于匹配目录中出现的文件名 使用Java正则表达式规则。所以,例如,你可以 写?select=*.(xml|xhtml)
以匹配这两个文件中的任何一个 文件扩展名。但请注意,URL中使用的特殊字符 (即反斜杠和花括号等字符不是 必须使用%HH对URI中的查询部分中允许的内容进行转义 惯例。例如,垂直条需要写为%7C。这个 使用encode-for-uri()函数可以实现转义。
请注意,Saxon的collection()函数现在还支持URI中的match = pattern,其中模式是标准的XPath 3.1正则表达式。