Как переместить динамический результирующий документ в отдельный включенный или импортированный файл xsl

#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 в отдельный файл и иметь такое же поведение.