вопрос для начинающих по XSLT - PullRequest
3 голосов
/ 08 ноября 2010

Я только начал изучать XSLT, сейчас я следую некоторому интерактивному учебнику по нему, и у меня сейчас есть простой вопрос:

предположим, у нас есть оригинальный файл xml, нам нужно написатьXSLT Stylesheet, чтобы пойти с ним, или мы просто передадим xml-файл в какое-то программное обеспечение, такое как Stylus Studio (Saxon Engine), тогда он будет делать все эти вещи автоматически для нас?Мне нужно преобразовать этот файл .svg в pdf, я только сейчас нахожусь в начале разработки, поэтому очень озадачен первым шагом. Кроме того, я хотел бы знать, если мой исходный ввод - файл .svg, сделайтеЯ должен явно преобразовать его в .xml, прежде чем я смогу начать использовать XSLT?

Заранее спасибо!

Ответы [ 3 ]

8 голосов
/ 09 ноября 2010

Извините за неправильное разъяснение. Мне нужно преобразовать этот файл .svg в pdf, я только сейчас нахожусь в начале разработки, поэтому я очень озадачен первым шагом. Также я хотел бы знать, если мой исходный ввод - файл .svg. Нужно ли явно преобразовывать его в файл .xml, прежде чем я смогу начать использовать XSLT?

Файл SVG является файлом XML в пространстве имен SVG. Нужно ли вам преобразовывать этот XML, зависит от того, как вы собираетесь его использовать. Если бы вы собирались сделать пакетную печать, используя что-то вроде Inkscape (редактор SVG), вы бы этого не сделали.

Если вы собираетесь использовать что-то вроде XSL-FO, вы бы это сделали. Ответ @Zoltan Hamori вводит в заблуждение. Вы можете использовать saxon для выполнения XSLT-преобразования (создания XSL-FO), но вам все равно понадобится процессор XSL-FO для создания PDF из XSL-FO.

Золтан упоминает FOP (процессор форматирования объектов Apache), но звучит так, будто FOP и XSL-FO одинаковы; они не. Его пример кода - таблица XSL-FO (XML в пространстве имен fo). Вам понадобится процессор, такой как FOP, RenderX, Antenna House и т. Д., Чтобы создать PDF из XSL-FO.

В основном вам нужно:

  1. Ввод XML (это будет ваш SVG-файл)
  2. XSLT-преобразование для создания XSL-FO.
  3. XSL-FO процессор для создания PDF из XSL-FO

Изучение XSL-FO одновременно с изучением XSLT будет непростым делом, но я покажу вам два способа вывода SVG в PDF.

Первый способ - обратиться к файлу SVG с помощью fo:external-graphic.

Второй способ - встроить SVG XML непосредственно в XSL-FO, используя fo:instream-foreign-object.

Поскольку ввод XML - это SVG XML, я бы выбрал второй вариант. Однако я не уверен, какое влияние это окажет на время обработки и какой способ будет более эффективным.

Я показал пример ниже. Поскольку я показал оба способа вывода SVG, это создаст двухстраничный PDF. На каждой странице будет SVG-изображение.

Примечания

  • Для тестирования я использовал пример SVG-файла, поставляемого с Inkscape. (Я удалил большую часть SVG XML из вывода XSL-FO, потому что он довольно большой.)
  • Для моего процессора XSLT я использовал Saxon-HE 9.2.0.6.
  • Для моего процессора FO я использовал Apache FOP версии 0.95 (хотя я очень предпочитаю RenderX).

Также

  • Saxon-HE и Apache FOP бесплатны.
  • Если вы дадите мне свою электронную почту, я могу отправить вам SVG-файл, который я использовал, вместе с полным выводом XSL-FO. Я также могу отправить вам созданный PDF-файл.

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- 
    This is an "identity" template.
    It copies whatever node from input to the output without changing it. 
    Learn it. Use it. Love it. -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body">
          <fo:block>
            <!-- This is the first way to output an SVG; by referencing the graphic. -->
            <fo:external-graphic src="test.svg"/>
            <!-- This is the second way to output an SVG; by outputting the SVG XML directly. -->
            <fo:instream-foreign-object>
              <xsl:apply-templates/>
            </fo:instream-foreign-object>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

</xsl:stylesheet>

XSL-FO (созданный Saxon из входных данных SVG и таблицы стилей XSL)

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg">
   <fo:layout-master-set>
      <fo:simple-page-master master-name="my-page">
         <fo:region-body/>
      </fo:simple-page-master>
   </fo:layout-master-set>
   <fo:page-sequence master-reference="my-page">
      <fo:flow flow-name="xsl-region-body">
         <fo:block>
            <fo:external-graphic src="test.svg"/>
            <fo:instream-foreign-object>
              <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
                    version="1.1"
                    width="595.99438"
                    height="491.50516"
                    id="svg2675">
                <!-- CONTENT REMOVED FOR STACKOVERFLOW.COM EXAMPLE -->
              </svg>
            </fo:instream-foreign-object>
         </fo:block>
      </fo:flow>
   </fo:page-sequence>
</fo:root>

Надеюсь, это поможет.

1 голос
/ 08 ноября 2010

Если вы хотите преобразовать данные в PDF, вы можете использовать XSL: FO / FOP.Вам нужен шаблон FOP, который представляет собой файл xsl и может быть преобразован в PDF.Этот xsl-файл может ссылаться на XML, внешние объекты, такие как файлы изображений, или вы можете использовать freemarker / speed для помещения данных в шаблон XSL.

Вы можете найти дополнительную информацию: http://www.treebuilder.de/svg/extentSVG/artikel/tut.html

Есливы используете теги FOP, вы можете ссылаться на файл SVG, например:

   <fo:table text-align="left" table-layout="fixed"
                                      background-image="SVG_file.svg">

Я думаю, что можно добавить файл svg в saxon в качестве параметра

0 голосов
/ 08 ноября 2010

Svg - это XML-файл. Таким образом, вы можете начать писать свою собственную таблицу стилей XSLT, чтобы преобразовать ее в нужный формат.

Но быстрый поиск по Google показал мне множество программ, которые могут сделать это преобразование для вас.

...