如何使用模板匹配uri-collection结果

时间:2019-04-09 12:37:34

标签: xslt xpath uri

我的变量带有文件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/>
  1. 会是处理文件的更好方法吗?我的意思是apply-templatesfor-each好。
  2. 是否可以避免模板匹配中的"*"?也许像“ * [。可转换为xs:anyURI]”之类的东西?

1 个答案:

答案 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可以很好地完成这项工作。

我已经通过使用“”回答了您的第二个问题。作为匹配所有内容的模式(包括原子值)。模式“ *”将仅匹配元素节点。