2016-11-29 2 views
0

У меня есть три XSL файлов и один входной файл:Как объединить несколько файлов xslt и xml-файлы для ввода как одного другого, чтобы получить окончательный вывод?

-input.xml process1.xsl output1.xml 
-output1.xml process2.xsl output3.xml 

теперь я хочу просто как:

input.xml process.xslt output.xml 

process1.xsl, process2.xsl и их результаты должны передавать как введите в файл xsl и сгенерируйте файл output.xml в том же файле process.xsl.

Как это сделать в xslt, я упомянул об импорте xslt apply, но я не получаю надлежащую ссылку для назначения вывода xml в качестве входных данных для другого xsl-файла в одном xsl .. может ли кто-нибудь помочь мне?

здесь я вызвал input.xml и использовал process1.xsl для первого шага , и полученный результат сгенерирован в переменной $ content, теперь я застрял здесь, как мне импортировать process2.xsl и оспаривать его предыдущий выход в переменных $ содержания, я просто в состоянии отобразить свой вывод я хочу Ассинг его к следующему XSL файл:

<xsl:import href="process1.xsl"/> 

<xsl:output method="xml" indent="yes"/> 



<xsl:template match="/"> 

<xsl:variable name="content"> 
    <xsl:apply-imports/> 
</xsl:variable> 

<xsl:apply-templates select="exsl:node-set($content)/*" mode="m"/> 
</xsl:template> 

<xsl:template match="@*|*|text()" mode="m"> 

<xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates select="@*|*|text()" mode="m"/> 
</xsl:copy> 

</xsl:template> 

что-то вроде этого, но это не работает?

+0

Какой процессор XSLT 2.0 вы используете? Последние процессоры поддерживают функцию 'transform' от https://www.w3.org/TR/xpath-functions-31/#func-transform, поэтому это будет самый общий и мощный подход, но для этого требуется использовать XSLT 3.0, как это поддерживается Saxon 9. 7 PE или EE или последняя Altova. Вам также нужно будет объяснить/показать, какой вход 'process.xslt' берет и как вы хотите рассматривать два результата как один вход. –

+0

Вы слышали о "https://www.w3.org/TR/xproc/"? Это очередность преобразований. Возможно, это может быть реализовано в вашей среде. – uL1

+0

@MartinHonnen Я использую файл Saxon HE 9.7.0, также я отредактировал вопрос с кодом – divya

ответ

0

Использование XSLT 3.0 вы можете использовать fold-left функцию (https://www.w3.org/TR/xpath-functions-31/#func-fold-left) вместе с transform функции (https://www.w3.org/TR/xpath-functions-31/#func-transform) в цепи преобразования:

<xsl:stylesheet 
version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
exclude-result-prefixes="fn xs"> 

<xsl:param name="sheet-uris" as="xs:string*" select="'process1.xsl', 'process2.xsl'"/> 

<xsl:param name="input-uri" as="xs:string" select="'input.xml'"/> 
<xsl:param name="input-doc" as="document-node()" select="doc($input-uri)"/> 

<xsl:mode on-no-match="shallow-copy"/> 

<xsl:template name="xsl:initial-template"> 
    <xsl:apply-templates select="fold-left($sheet-uris, $input-doc, function($input, $sheet-uri) { transform(map { 'stylesheet-location' : $sheet-uri, 'source-node' : $input })?output })"/> 
</xsl:template> 

<xsl:template match="/*"> 
    <xsl:comment select="'Processed by ' || document-uri(document(''))"/> 
    <xsl:next-match/> 
</xsl:template> 

</xsl:stylesheet> 

Очевидно, что в реальной трансформации ваша таблица стилей будет делать больше, чем вывод комментарий для указания его обработки ввода, но с использованием таблицы стилей выше с названием саксонской 9.7 EE и -it -xsl:process.xsl, где вход

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <foo>bar</foo> 
</root> 

и ТВт O таблицы стилей process1.xsl и process2.xsl являются, например,

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" xmlns:xhtml="http://www.w3.org/1999/xhtml" exclude-result-prefixes="array fn map math xhtml xs"> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="/*"> 
     <xsl:comment select="'Processed by ' || document-uri(document(''))"/> 
     <xsl:next-match/> 
    </xsl:template> 

</xsl:stylesheet> 

выход

<?xml version="1.0" encoding="UTF-8"?><!--Processed by file:/SomePath/process1.xsl--><!--Processed by file:/SomePath/process2.xsl--><!--Processed by file:/SomePath/process.xsl--><root> 
    <foo>bar</foo> 
</root> 

поэтому сцепление работает.

Вместо передачи входного документа в качестве параметра вы можете также предоставить его в качестве основного входа -s и изменить основную таблицу стилей

<xsl:stylesheet 
version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:fn="http://www.w3.org/2005/xpath-functions" 
exclude-result-prefixes="fn xs"> 

<xsl:param name="sheet-uris" as="xs:string*" select="'process1.xsl', 'process2.xsl'"/> 

<xsl:mode on-no-match="shallow-copy"/> 

<xsl:template match="/"> 
    <xsl:apply-templates select="fold-left($sheet-uris, ., function($input, $sheet-uri) { transform(map { 'stylesheet-location' : $sheet-uri, 'source-node' : $input })?output })/node()"/> 
</xsl:template> 

<xsl:template match="/*"> 
    <xsl:comment select="'Processed by ' || document-uri(document(''))"/> 
    <xsl:next-match/> 
</xsl:template> 

</xsl:stylesheet> 

Если вы хотите цепи преобразований с Java, то увидите https://stackoverflow.com/a/35845231/252228 для примера ,

+0

привет спасибо за вашу ссылку, но я вынужден использовать его в версиях xslt 2.0 и SAXON HE. – divya

+0

@divya, если модули стилей уже не используют режимы или не предоставляют именованные шаблоны, чтобы отличать шаги обработки. Думаю, вам сначала нужно их отредактировать, если вы хотите сделать это в чистом XSLT 2.0. В общем случае импортировать два модуля недостаточно для управления различными шагами преобразования. Если ваш вопрос касается двух конкретных таблиц стилей, используемых с некоторым конкретным входом, тогда подумайте о том, чтобы показать детали в редактировании вашего вопроса. –

+0

Я отредактировал вопрос о том, что пытался использовать режим. – divya

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