закодировать для uri и абсолютные пути Windows - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть XML-файл, который содержит разделы, начинающиеся с имени файла:

<madcapfile filename="C:\1\Outputpath\The 7% solution.xlf">

Каждый раздел должен быть сохранен в отдельный файл. Это мой XSLT:

<xsl:template match="madcapfile">
  <xsl:variable name="file1" select="concat('file:///',@filename)"/>
  <xsl:variable name="file2" select="encode-for-uri($file1)"/>
  <xsl:variable name="file3" select="concat('file:///',replace(@filename,'%','%25'))"/>
  <xsl:result-document method="xml" href="{$file2}">  
    <xsl:apply-templates select="node()"/>
  </xsl:result-document>
</xsl:template>

Переменные file1, file2, file3 пока мои попытки. Переменная file1 создает файлы в правильных местах для всех файлов, кроме тех, у которых в имени файла указан%.
Переменная file3 создает файлы в правильных местах для всех файлов, так что это рабочее решение.

Использование переменной file2 приводит к ошибке: процессор XSLT (Saxon 9.7) пытается записать файлы в

C:\Path-to-XSLT\C:\1\Outputpath\The 7% solution.xlf  

т.е. похоже, что encode-for-uri обрабатывает входные данные как относительный путь, даже если он начинается с "C: \"
Я также попытался добавить «file: ///» в начало пути, что не меняет поведение encode-for-uri.

Есть ли способ заставить encode-for-uri обрабатывать свой ввод как абсолютный путь?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

По конкретному вопросу:

Есть ли способ заставить кодировку для uri обрабатывать свой ввод как абсолютный путь?

В спецификации говорится оfn: encode-for-uri:

Кодирует зарезервированные символы в строку, предназначенную для использования в сегменте пути URI.

Таким образом, ответнет: это не то, для чего предназначена функция.Он не предназначен для обработки полных URI или для понимания их синтаксиса;он предназначен для обработки строки, которая должна использоваться при построении сегмента пути URI.

0 голосов
/ 26 апреля 2018

Существует две проблемы: атрибуты href ожидают URI, а в URI символ-разделитель равен /, а не \, который используется в путях к файлам Windows.Кроме того, использование encode-for-uri позволяет избежать обратной косой черты.

Таким образом, чтобы решить эту проблему, вы должны заменить любую обратную косую черту на прямую косую черту, затем вы можете использовать encode-for-uri для экранирования знака процента:

concat('file:///', encode-for-uri(replace(@filename, '\\', '/')))
...