2017-02-16 5 views
0

У меня есть следующий XSL:SVG элементов в XML для генерации PDF-файл

<fo:block space-before="5mm" font-size="12pt" display-align="center" text-align="center"> 

       <fo:instream-foreign-object background-color="white" content-height="200mm" content-width="150mm" height="200mm" width="150mm" padding="5pt"> 
         <svg width="15cm" height="20cm" version="1.1" viewBox="0 0 300 300" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 


          <xsl:variable name="var_span"> 
           <xsl:value-of select="pdftest/span" /> 
          </xsl:variable> 
          <xsl:variable name="var_width2Balken"> 
           <xsl:value-of select="pdftest/width2Balken" /> 
          </xsl:variable> 
          <xsl:variable name="var_xoffset"> 
           <xsl:value-of select="pdftest/xoffset" /> 
          </xsl:variable> 
          <xsl:variable name="var_yoffset"> 
           <xsl:value-of select="pdftest/yoffset" /> 
          </xsl:variable> 
          <xsl:variable name="var_yMax"> 
           <xsl:value-of select="pdftest/yMax" /> 
          </xsl:variable> 
          <xsl:variable name="var_yMin"> 
           <xsl:value-of select="pdftest/yMin" /> 
          </xsl:variable> 
          <xsl:variable name="var_xMax"> 
           <xsl:value-of select="pdftest/xMax" /> 
          </xsl:variable> 

          <!-- <xsl:variable name="var_xLast"> <xsl:value-of select="0" /> </xsl:variable> --> 




          <!-- <line x1="{$var_xoffset}" y1="{$var_yoffset -100}" x2="{$var_xMax}" y2="{$var_yoffset -100}" style="stroke:gray;stroke-width:1;" /> --> 


          <line x1="{$var_xoffset}" y1="{$var_yoffset}" x2="{$var_xMax + $var_xoffset}" y2="{$var_yoffset}" style="stroke:black;stroke-width:5;" /> 
          <line x1="{$var_xoffset}" y1="0" x2="{$var_xoffset}" y2="{$var_yMin + $var_yMax}" style="stroke:black;stroke-width:5;" /> 





         </svg> 
        </fo:instream-foreign-object> 

        </fo:block> 

и следующий XML:

<pdftest> 
    <span>10</span> 
    <width2Balken>38</width2Balken> 
    <xoffset>0</xoffset> 
    <yoffset>280</yoffset> 
    <xMax>300</xMax> 
    <yMax>200</yMax> 
    <yMin>100</yMin> 
</pdftest> 

Я знаю, что это прекрасно работает при использовании fop1.1 для создания PDF.

Мой вопрос, однако, заключается в следующем: возможно ли, но все в xml (часть xsl и xml-части), а затем есть только 1 тег, чтобы показать его в xsl без всякой логики и так далее?

Таким образом, в конце концов, вы бы

XSL: <xsl:value-of select="svg-all"> 

и в XML ваш имеют

<svg-all>all of the above xsl with the xml values</svg-all> 

Я знаю, что это не самое лучшее программирования и иметь все проверочные элемент в XSL лучше , но мне было интересно, если это возможно и как. Любая помощь будет замечательной.

Спасибо. TheVagabond

+0

Вы говорите, вы хотите увидеть '<строки x1 =«{$ var_xoffset}»/>' внутри XML, например, или вы просто хотите см. значения, предварительно просчитанные, например '<строка x1 =" 0 "/>'? Спасибо. –

+0

Второй - предварительно рассчитанный. Но все в XML-файле – Thevagabond

ответ

1

Вам просто нужно использовать xsl:copy-of, а не xsl:value-of.

Предположим, вам XML, как так ...

<pdftest> 
    <span>10</span> 
    <width2Balken>38</width2Balken> 
    <xoffset>0</xoffset> 
    <yoffset>280</yoffset> 
    <xMax>300</xMax> 
    <yMax>200</yMax> 
    <yMin>100</yMin> 
    <svg-all xmlns="http://www.w3.org/2000/svg"> 
     <line x1="0" y1="280" x2="300" y2="280" style="stroke:black;stroke-width:5;" /> 
     <line x1="0" y1="0" x2="0" y2="300" style="stroke:black;stroke-width:5;" /> 
    </svg-all>  
</pdftest> 

Тогда создание fo:block будет выглядеть следующим образом ...

<fo:block space-before="5mm" font-size="12pt" display-align="center" text-align="center"> 
    <fo:instream-foreign-object background-color="white" content-height="200mm" content-width="150mm" height="200mm" width="150mm" padding="5pt"> 
     <svg width="15cm" height="20cm" version="1.1" viewBox="0 0 300 300" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 
      <xsl:copy-of select="pdftest/svg:svg-all/*" /> 
     </svg> 
    </fo:instream-foreign-object> 
</fo:block> 

Обратите внимание, что вам нужно будет объявить svg пространство имен в вашем XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:svg="http://www.w3.org/2000/svg"> 

В качестве альтернативы вы можете упростить r current XSLT. Например, объявления xsl:variable могут быть упрощены. Вместо того, чтобы писать это ...

<xsl:variable name="var_span"> 
    <xsl:value-of select="pdftest/span" /> 
</xsl:variable> 

Вы можете написать только это ...

<xsl:variable name="var_span" select="pdftest/span" /> 

Вы могли бы еще больше упростить текущий XSLT, имея шаблон, соответствующий pdftest, и даже удаление переменных в целом. Например, рассмотрим это ...

<xsl:template match="/"> 
    <fo:block space-before="5mm" font-size="12pt" display-align="center" text-align="center"> 
     <fo:instream-foreign-object background-color="white" content-height="200mm" content-width="150mm" height="200mm" width="150mm" padding="5pt"> 
      <xsl:apply-templates select="pdftest" mode="svg" /> 
     </fo:instream-foreign-object> 
    </fo:block> 
</xsl:template> 

<xsl:template match="pdftest" mode="svg"> 
    <svg width="15cm" height="20cm" version="1.1" viewBox="0 0 300 300" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg"> 
     <line x1="{xoffset}" y1="{yoffset}" x2="{xMax + xoffset}" y2="{yoffset}" style="stroke:black;stroke-width:5;" /> 
     <line x1="{xoffset}" y1="0" x2="{xoffset}" y2="{yMin + yMax}" style="stroke:black;stroke-width:5;" /> 
    </svg> 
</xsl:template> 
+0

Большое спасибо .... мне очень помогло. – Thevagabond

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