2016-11-14 2 views
0

Я хочу обрабатывать все XML-файлы в каталоге, генерируя имена выходных файлов на основе значения в каждом XML. Я использую функцию коллекции Saxon в сочетании с функцией base-uri, но мне трудно получить доступ к каждому URI в отдельности.Использование XSLT base-uri с функцией коллекции Saxon

Изменить: ниже таблица стилей выдает сообщение об ошибке: «Последовательность более одного элемента не допускается в качестве первого аргумента базы-URI()»

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 
    <xsl:param name="input-dir" select="'file:///C:/path/to/directory'"/> 

    <xsl:template name="main"> 
     <xsl:variable name="input-docs" select="collection(iri-to-uri(concat($input-dir, '?select=*.xml')))"/> 
     <xsl:variable name="old-filename" select="base-uri($input-docs)"/> 
     <xsl:variable name="new-filename" select="item[@name = 'LogNo']/text"/> 

     <xsl:for-each select="$old-filename"> 
      <xsl:result-document href="concat ($new-filename, '.xml')"> 
       <xsl:copy-of select="."/> 
      </xsl:result-document> 
     </xsl:for-each> 

    </xsl:template> 

</xsl:stylesheet> 

Edit: для полноты картины, I» Вы добавили две подсказки командной строки, которые я попытался. Я не уверен, что путь к входному каталогу должен быть указан в таблице стилей или в командной строке.

java -jar "C:\path\to\saxon.jar" -it:main -o:"C:\path\to\renamed\XML" -xsl:"C:\path\to\stylesheet.xslt" 

java -jar "C:\path\to\saxon.jar" -s:"C:\path\to\input\XML" -o:"C:\path\to\renamed\XML" -xsl:"C:\path\to\stylesheet.xslt" 
+0

Выполняется ли эта работа, когда вы помещаете «concat ($ new-filename,« .xml ») в' {} '? – uL1

+0

Боюсь, я не следую ... куда бы влезли фигурные скобки? – b00kgrrl

+0

uL1 предлагает использовать AVT (https://www.w3.org/TR/xslt#attribute-value-templates), чтобы он выглядел как 'href =" {concat ($ new-filename, '.xml')} "'. Однако контекст вашего 'for-each' будет строкой (' $ old-filename'); возможно, вы хотите вместо этого выбрать '$ input-docs'? –

ответ

0

Часто возникает вопрос, где ваши ошибки, если вы следуете дисциплине, всегда объявляющей тип данных ваших переменных.

Например, очевидно, что объявление input-docs должно иметь тип as="document-node()*". Но это явно недействительный аргумент для звонка на base-uri().

Итак, очевидно, что не так с вашим кодом (и действительно, сообщение об ошибке ясно говорит). Исправить это сложнее, потому что вы не сказали нам, чего вы хотите достичь. Но нормальная логика будет что-то вроде этого:

<xsl:template name="main"> 
    <xsl:variable name="input-docs" 
     select="collection(iri-to-uri(concat($input-dir, '?select=*.xml')))" 
     as="document-node()*"/> 
    <xsl:for-each select="$input-docs"> 
     <xsl:variable name="new-filename" 
        select="item[@name = 'LogNo']/text"   
        as="xs:string"/> 
     <xsl:result-document href="concat ($new-filename, '.xml')"> 
     <xsl:copy-of select="."/> 
     </xsl:result-document> 
    </xsl:for-each> 

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

+0

Я хотел бы вывести один файл XML для каждого входного файла в каталоге, но я хочу, чтобы имя файла было основано на элементе в каждом файле. Я получаю сообщение об ошибке: Ошибка в строке 6 LogNo.xslt: XTTE0570: последовательность из более чем одного элемента не допускается, поскольку значение переменной $ input-docs (document-node(), document- node(), ...) Последовательность более чем одного элемента не допускается, так как значение переменной $ input-docs (document-node(), document-node(), ...) – b00kgrrl

+0

@ b00kgrrl, являются вы уверены, что у вас есть 'as =" document-node() * "' (со звездочкой '*' после 'document-node()'), когда вы получаете эту ошибку? –

+0

Когда я добавляю звездочку, я больше не получаю эту ошибку. Теперь я могу выводить один XML-файл для каждого входного файла, но имя нового файла не получает. Проблема, похоже, в командной строке. Входной каталог не получает. Это то, что у меня есть: java -jar "C: \ path \ to \ saxon.jar" -it: main -o: "C: \ path \ to \ renamed \ XML" -xsl: "C: \ path \ to \ таблицы стилей.xslt " – b00kgrrl

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