在 xsl 中垂直对齐 SVG 旁边的文本

Align text vertically next to SVG in xsl

我正在尝试对齐 SVG 图像旁边的文本 insde XSL,然后用于创建 pdf。

这是我设置文本和 SVG 的地方:

<fo:block font-size="14pt" text-align="center" margin-top="2cm">
    <fo:instream-foreign-object>
        <svg:svg width="30" height="30" xml:space="preserve">
            <svg:g style="fill:none; stroke:black; stroke-width:1">
                <svg:rect x="0" y="0" width="30" height="30"/>
            </svg:g>
        </svg:svg>
    </fo:instream-foreign-object>

    Mark If Closed
</fo:block>

这是输出:

我希望文本 "Mark If Closed" 与方形 SVG 垂直居中。

如果正方形的大小是恒定的,你可以玩一下baseline-shift。给定 30 的 SVG 高度和 14pt 的字体大小,大约 5pt 的基线偏移就可以了。

            <fo:block font-size="14pt" text-align="center" background-color="silver">
            <fo:instream-foreign-object>
                <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="30" height="30" xml:space="preserve">
                        <svg:g style="fill:none; stroke:black; stroke-width:1">
                            <svg:rect x="0" y="0" width="30" height="30"/>
                        </svg:g>
                </svg:svg>
            </fo:instream-foreign-object><fo:inline background-color="yellow" baseline-shift="5pt">Mark If Closed</fo:inline></fo:block>

产生这个(为清楚起见添加了颜色):

让格式化程序解决...

让格式化程序进行计算(假设 line-height(参见 https://www.w3.org/TR/xsl11/#line-height)是“1.2”):

<fo:block font-size="14pt" text-align="center" margin-top="2pt"
    background-color="silver">
    <fo:instream-foreign-object baseline-shift="-((30pt - 1em * 1.2) div 2)">
        <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="30" height="30" xml:space="preserve">
    <svg:g style="fill:none; stroke:black; stroke-width:1">
        <svg:rect x="0" y="0" width="30" height="30" />
    </svg:g>
</svg:svg>
    </fo:instream-foreign-object>
    <fo:inline background-color="yellow">Mark If Closed</fo:inline>
</fo:block>

将框向下移动 50%:

<fo:block font-size="14pt" text-align="center" margin-top="2pt"
    background-color="silver">
    <fo:instream-foreign-object baseline-shift="-50%">
        <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="30" height="30" xml:space="preserve">
            <svg:g style="fill:none; stroke:black; stroke-width:1">
                <svg:rect x="0" y="0" width="30" height="30" />
            </svg:g>
        </svg:svg>
    </fo:instream-foreign-object>
    <fo:inline background-color="yellow">Mark If Closed</fo:inline>
</fo:block>

fo:instream-foreign-object 上使用 alignment-baseline(参见 https://www.w3.org/TR/xsl11/#alignment-baseline):

<fo:block font-size="14pt" text-align="center" margin-top="2pt"
    background-color="silver">
    <fo:instream-foreign-object alignment-baseline="middle">
        <svg:svg xmlns:svg="http://www.w3.org/2000/svg" width="30" height="30" xml:space="preserve">
    <svg:g style="fill:none; stroke:black; stroke-width:1">
        <svg:rect x="0" y="0" width="30" height="30" />
    </svg:g>
</svg:svg>
    </fo:instream-foreign-object>
    <fo:inline background-color="yellow">Mark If Closed</fo:inline>
</fo:block>