Как сопоставить результаты URI-коллекции с помощью шаблонов - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть переменная с коллекцией файлов 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-templates лучше, чем for-each.
  2. Есть ли способ избежать "*" в шаблонном совпадении?Может быть что-то вроде "* [. Castable as xs: anyURI]"?

1 Ответ

1 голос
/ 09 апреля 2019

Во-первых, я не думаю, что от применения 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 отлично справляется со своей задачей.

Я ответил на ваш второй вопрос, используя "."как образец, который соответствует всему (включая атомарные значения).Шаблон "*" будет соответствовать только узлам элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...