我的变量带有文件URI的集合。
<xsl:variable name="swiftFilesPath" select="concat($inputPath, '?select=*.swift;recurse=yes;on-error=warning')"/>
<xsl:variable name="swiftFiles" select="uri-collection($swiftFilesPath)"/>
我想使用apply-templates来处理所有URI。
目前,我正在使用for-each来获取文件,然后处理每一行。
<xsl:for-each select="$swiftFiles">
[...]
<xsl:variable name="filePath" select="."/>
<xsl:variable name="fileContent" select="unparsed-text($filePath, $encoding)"/>
<xsl:for-each select="tokenize($fileContent, '\n')">
[...]
</xsl:for-each>
</xsl:for-each>
我正在考虑将其更改为以下内容:
<xsl:apply-templates select="$swiftFiles" mode="swiftFiles"/>
[...]
<xsl:template match="*" mode="swiftFiles">
[...]
</xsl:template/>
apply-templates
比for-each
好。"*"
?也许像“ * [。可转换为xs:anyURI]”之类的东西?答案 0 :(得分:1)
首先,除非发生某种形式的动态发送,否则我认为使用apply-templates不会有任何好处。例如,如果您同时具有.txt URI和.xml URI,则可以
<xsl:apply-templates select="uri-collection(....)" mode="dereference"/>
<xsl:template match=".[ends-with(., '.txt')]" mode="dereference">
--- process unparsed text file ----
</xsl:template>
<xsl:template match=".[ends-with(., '.xml')]" mode="dereference">
--- process XML file ----
</xsl:template>
<xsl:template match="." mode="dereference"/>
但是,如果它们的处理方式相同,则xsl:for-each可以很好地完成这项工作。
我已经通过使用“”回答了您的第二个问题。作为匹配所有内容的模式(包括原子值)。模式“ *”将仅匹配元素节点。