XML 中用于生成 pdf 的 SVG 元素
SVG elements in XML for pdf generation
我有以下 xsl:
<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 中包含所有控制元素更好,但我想知道这是否可能以及如何实现。
任何帮助都会很棒。
谢谢。流浪者
您只需要使用 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>
请注意,您需要在 XSLT
中声明 svg
命名空间
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:svg="http://www.w3.org/2000/svg">
顺便说一句,您可以简化当前的 XSLT。例如,可以简化 xsl:variable
声明。而不是写这个...
<xsl:variable name="var_span">
<xsl:value-of select="pdftest/span" />
</xsl:variable>
你可以只写这个...
<xsl:variable name="var_span" select="pdftest/span" />
您可以通过模板匹配 pdftest
甚至完全删除变量来进一步简化当前的 XSLT。例如,考虑这个...
<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>
我有以下 xsl:
<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 中包含所有控制元素更好,但我想知道这是否可能以及如何实现。 任何帮助都会很棒。
谢谢。流浪者
您只需要使用 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>
请注意,您需要在 XSLT
中声明svg
命名空间
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:svg="http://www.w3.org/2000/svg">
顺便说一句,您可以简化当前的 XSLT。例如,可以简化 xsl:variable
声明。而不是写这个...
<xsl:variable name="var_span">
<xsl:value-of select="pdftest/span" />
</xsl:variable>
你可以只写这个...
<xsl:variable name="var_span" select="pdftest/span" />
您可以通过模板匹配 pdftest
甚至完全删除变量来进一步简化当前的 XSLT。例如,考虑这个...
<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>