2013-06-20 2 views
1

У меня есть следующий XSL, чтобы преобразовать кучу XML-файлов из одного формата в другой. Преобразование работает нормально, хотя до сих пор у меня нет двух нерешенных вопросов:XSL 2.0 Преобразование XML-файлов при сохранении структуры папок

1) Сначала при преобразовании файлов мне нужно настроить мой параметр в таблице стилей, чтобы отображать только файлы с именами длиной более 7 символов;

2) Во-вторых, мне нужно иметь возможность преобразовывать все файлы при сохранении структуры папок исходных файлов. Мне было интересно, есть ли способ сохранить ту же структуру папок, что и в исходной папке. Все файлы расположены в папках, названных на основе алфавита, таких как: A, B, C, D, F .... Поэтому мне нужно преобразовать все файлы в папку A и поместить их в новую папку с именем A. Файлы также называются по алфавиту.

Вот мой таблицы стилей:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" 
xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/"> 

<!-- This adds DOCTYPE declaration --> 
<xsl:output method="xml" doctype-public="-//OASIS//DTD DITA Glossary//EN" 
doctype-system="glossary.dtd" omit-xml-declaration="no" indent="yes"/> 

<!-- The below line ensures that all empty space and carriage returns are removed from the title element producing proper file names --> 
<xsl:strip-space elements="title"/> 

<xsl:param name="files" select="collection('../DITA/B/?select=*.dita;recurse=yes')"/> 

<!-- <xsl:variable name="filename" select="concat($files,position(),'topic')" />--> 

<xsl:template match="node()"> 
<xsl:copy copy-namespaces="no"> 
<xsl:apply-templates select="node()"/> 
</xsl:copy> 
</xsl:template> 
<xsl:template match="/"> 

<xsl:for-each select="$files//topic"> 
<xsl:if test="string-length(files) &gt; 10"> 
<!-- not working, the purpose is to drop all the files whose name length is less than two letters --> 

<xsl:value-of select="text()" disable-output-escaping="yes"/> 
</xsl:if> 
<xsl:result-document href="outputDITANEW/B/{title/text()|title/b/text()}.dita"> 
<glossentry id="{concat('test', generate-id())}"> 
<glossterm id="{concat('test_title', generate-id())}"> 
<xsl:value-of select="title"/> 
</glossterm> 
<glossdef> 
<xsl:for-each select="body"> 
<xsl:apply-templates/> 
</xsl:for-each> 
</glossdef> 
</glossentry> 
</xsl:result-document> 
</xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Спасибо.

ответ

2

(a) select = *. Dita на самом деле является регулярным выражением, маскирующимся как glob, и вы должны использовать что-то вроде select=[A-Za-z0-9]{7,}.dita, чтобы быть более избирательным.

(b) Функция document-uri(), примененная к файлу, возвращает URI входного файла, если известна, и из этого вы должны иметь возможность создать требуемое имя выходного файла.

+0

Спасибо, Майкл, когда я попробую выше предлагаемый select =, я получаю следующую ошибку: FODC0004: Недопустимый относительный URI "../ DITA/A /? Select = [AZ] {7,}. Di ..." передан функции collection(). Вы знаете, почему? Я еще не пробовал документ-uri(), я попробую, как только вопрос 1 будет решен. Я использую Saxon-PE 9.5.02 с oXygen XML v15.0. Еще раз спасибо. – ManUO

+0

К сожалению, есть специальные символы, такие как [] {}, которые, вероятно, должны быть закодированы в процентах, чтобы включить их в URI. Вы можете сделать это с помощью encode-for-uri(). Я не знаю, сможет ли Saxon успешно декодировать их на другом конце, но стоит попробовать. –

+0

Спасибо, Майкл, процентная кодировка сделала трюк для имени файла. Теперь мне нужно работать над вопросом 2, все еще пытаясь понять, как использовать второе предложение о документе-uri(). – ManUO

0

Если вы используете кислород, и вы установили каркас Дита, то есть основы библиотеки/Dita/Дита/плагины/net.sourceforge.dita4publishers.common.xslt/XSL/Библиотека/relpath_util.xsl

Эта библиотека предоставляет функции для манипулирования URL-адресами и упрощает выполнение таких действий, как получение родительского пути входного документа, вычисление относительных путей и т. Д. Это должно быть именно то, что вам нужно для создания URL-адресов результатов.

+0

Спасибо DrMacro, Любой практический пример работы с DITA4Publishers использованием relpath_utility действительно поможет. – ManUO

+0

Если вы посмотрите на функции в файле relpath_util.xsl, вы увидите, что все они названы довольно четко. Кроме того, есть также relpath_util_test.xsl, который демонстрирует, как использовать различные функции. Для создания новых URL-адресов результатов ключевыми функциями являются getParent() и newFile() – DrMacro

 Смежные вопросы

  • Нет связанных вопросов^_^