#xslt #doctype #xslt-2.0 #saxon #indentation
#xslt #doctype #xslt-2.0 #саксонский #отступ
Вопрос:
У меня есть куча файлов xsl. Я хочу централизованно управлять отступом результирующего документа. Теперь я использую приведенный ниже код в каждом файле xsl. У меня есть шаблон xsl:template name=»data» в каждом файле, но содержимое этого шаблона отличается. Возможно ли правильно переместить содержимое xsl:template match=»/» в отдельный файл xsl и импортировать его в каждый файл xsl. Я пытался, но безрезультатно. Может кто-нибудь посоветовать мне рабочий код?
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="indent" select="//page/view-data/html-indent"/>
<xsl:if test="$indent='yes'">
<xsl:result-document format="indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
<xsl:if test="$indent='no'">
<xsl:result-document format="no_indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
</xsl:template>
<xsl:template name="data">
<!-- The content is different from file to file -->
</xsl:template>
</xsl:stylesheet>
Комментарии:
1. вы можете попробовать также xsl: включить инструкцию — в этом случае шаблоны будут иметь те же приоритеты, что и основной документ
2. Это не имеет значения, я пробовал оба: xsl: include и xsl: import. Никакого эффекта.
Ответ №1:
Похоже, вы упустили из виду тот факт, что существует гораздо более простой способ сделать это.
<xsl:param name="indent" select="'no'"/>
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:result-document indent="{$indent}">
....
</xsl:result-document>
</xsl:template>
а затем укажите значение отступа в качестве параметра таблицы стилей. И на самом деле есть еще более простой способ: вы можете переопределить свойства сериализации, указанные в таблице стилей, свойствами, предоставляемыми из командной строки или Java API: в командной строке просто укажите !indent=yes или !indent=no .
Комментарии:
1. Спасибо за вашу помощь, Майкл, это работает! Я использую свой пользовательский тег jsp в веб-приложении для преобразования XML-файла внутри jsp с помощью xsl, чтобы использовать последнюю версию Saxon при преобразовании. Однако более простой способ здесь бесполезен.
Ответ №2:
Да, это так:
Переместите повторяющийся код в новый файл .xsl, например main.xsl :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="indent" select="//page/view-data/html-indent"/>
<xsl:if test="$indent='yes'">
<xsl:result-document format="indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
<xsl:if test="$indent='no'">
<xsl:result-document format="no_indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
</xsl:template>
<xsl:template name="data"/>
</xsl:stylesheet>
Затем в других ваших файлах .xsl просто используйте xsl:импорт в верхней части вашего документа :
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="file:///C:/Users/Stefanos/area51/main.xsl"/>
<!--Other stuff here-->
<xsl:template match="extra"/>
</xsl:stylesheet>
И добавьте больше кода. Надеюсь, это помогло 🙂
Комментарии:
1. Проблема в моем коде заключается в том, что я использую <xsl:template name=»data»/> </xsl:stylesheet> и не могу переместить его в основной файл.xsl. Шаблон «данные» используется в каждом файле, но его содержимое от файла к файлу отличается.
2. @user1018219 Хорошо, если содержимое отличается, и вы хотите, чтобы для него была другая обработка, тогда оно должно быть в отдельных файлах. Просто. Или вы могли бы учитывать все возможные различные содержимое с помощью одного шаблона с условными обозначениями.
3. Я попытался оставить свои разные шаблоны «данных» в файлах xsl «как есть» (скажем, 1.xsl, 2.xsl, 3.xsl) и перенести код из <xsl:template match=»/»> в отдельный файл, например, main.xsl . Но в этом случае вызов шаблона «данные» из main.xsl выдает ошибку.
4. @user1018219 Без фактического кода я и никто другой не можем помочь.
Ответ №3:
Хорошо, после разделения это main.xsl . Я просто упростил здесь значение переменной.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output name="indent" method="html" indent="yes" omit-xml-declaration="yes"/>
<xsl:output name="no_indent" method="html" indent="no" omit-xml-declaration="yes"/>
<xsl:template match="/">
<xsl:variable name="indent" select="'yes'"/>
<xsl:if test="$indent='yes'">
<xsl:result-document format="indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
<xsl:if test="$indent='no'">
<xsl:result-document format="no_indent" >
<xsl:call-template name="data"/>
</xsl:result-document>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
И следующий файл, скажем, 1.xsl
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<xsl:import href="main.xsl"/>
<xsl:template name="data">
...
</xsl:template>
</xsl:stylesheet>
Здесь у меня ошибка преобразования xsl
Комментарии:
1. Вы должны были отредактировать свой первоначальный ответ. В любом случае, в чем именно ваша проблема?
2. Проблема после разделения заключается в вызове шаблона данных в 1.xsl из main.xsl
3. Вы ошиблись. 1.xsl импортирует все, что находится внутри main.xsl, и вызывает любые шаблоны, которые необходимо вызвать в этом .xml, а затем будет вызван шаблон данных.
4. Звучит хорошо, но моя цель — применить xsl: документ-результат к шаблону «данные», который находится в 1.xsl, что было раньше в одном файле до разделения.
5. Я не знаю, что вы имеете в виду. В моем первом случае я могу вызвать шаблон из xsl: result-document, и он работает внутри моего приложения. Я только хочу перенести код с условиями xsl: result-document в отдельный файл и иметь такое же поведение.