1

我对 XML 的 XSL 转换的 HTML 输出有问题。在 XML 中,可以看到段落中间有一个分页符

. 样式表此时会插入一个可视分页符,但这会破坏整个段落的格式。分页符后出现的行缩进正确,但行距太近,看起来和普通段落一样。有没有办法在不进行大修的情况下解决这个问题?

我相信我已经包含了所有相关代码:

开始 XML

<floatingText xml:id="foo.001" type="bar">
<opener>
    <address>
        <addrLine>Address</addrLine>
        <addrLine>
            <date when="2017-04-26">April 26, 2017</date>
        </addrLine>
    </address>
    <salute>
        <hi rend="italic">Hello world.</hi>
    </salute>
</opener>
<body>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Pellentesque eget odio<pb type="recto" n="19"/> pellentesque, mollis 
mi et, malesuada
        est. Duis eleifend ullamcorper justo, vitae accumsan ante 
porta id.</p>
    <closer>
        <salute>Yours,</salute>
        <signed>Me</signed>
    </closer>
</body>
</floatingText>

结束 XML

开始 XSL 转换

<xsl:template match="pb[@n]">
<LEFT>
    <table>
        <tr>
            <td>&#160;</td>
        </tr>
        <tr>
            <td style="white-space: nowrap"> - - - - - - - - - - - - 
- - - - - -
                <font face="Arial" size="-2">
                    [Begin&#160;page&#160;<xsl:value-of select="@n"
                    />]</font> - - - - - - - - - - - - - - - - - - 
</td>
        </tr>
        <tr>
            <td height="10">&#160;</td>
        </tr>
    </table>
</LEFT>
</xsl:template>
<xsl:template match="p">
<xsl:choose>
    <xsl:when test="@rend = 'center'">
        <p/>
        <font face="Arial Unicode MS, sans-serif" size="-1">
            <center>
                <xsl:apply-templates/>
            </center>
        </font>
    </xsl:when>
    <xsl:otherwise>
        <font face="Arial Unicode MS, sans-serif" size="-1">
            <p/>&#160;&#160;&#160;&#160;&#160;<xsl:apply-templates/>
        </font>
    </xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="closer | opener | dateline">
<font face="Arial Unicode MS, sans-serif" size="-1">
    <blockquote>
        <xsl:apply-templates/>
        <br/>
    </blockquote>
</font>
</xsl:template>
<xsl:template match="salute | signed">
<font face="Arial Unicode MS, sans-serif" size="-1">
    <p/>
    <br/>
    <xsl:apply-templates/>
    <br/>
</font>
</xsl:template>
<xsl:template match="floatingText[@type = 'letter']">
<blockquote>
    <font face="Arial Unicode MS, sans-serif" size="-1">
        <xsl:apply-templates/>
    </font>
</blockquote>
</xsl:template>

结束 XSL

开始 HTML 输出

<font xmlns="" face="Arial Unicode MS, sans-serif" size="-1">
<blockquote>
    <font face="Arial Unicode MS, sans-serif" size="-1">
        <font face="Arial Unicode MS, sans-serif" size="-1">
            <blockquote>
                <font face="Arial Unicode MS, sans-serif" size="-1">
                    <br />Address
                </font>
                <font face="Arial Unicode MS, sans-serif" size="-1">
<br /> April 26, 2017.
                </font>
                <font face="Arial Unicode MS, sans-serif" size="-1">
<p /><br /> 
                    <font face="Arial, sans-serif"><i>Hello world.
</i>
                    </font><br />
                </font><br />
            </blockquote>
        </font>
        <font face="Arial Unicode MS, sans-serif" size="-1">
            <p />&#160;&#160;&#160;&#160;&#160;Lorem ipsum dolor sit 
amet, consectetur adipiscing elit. Pellentesque posuere, erat non 
commodo ornare, nunc nulla faucibus mauris, quis venenatis urna 
turpis eu lorem. Pellentesque eget odio
            <CENTER>
                <table>
                    <tr>
                        <td>&#160;
                        </td>
                    </tr>
                    <tr>
                        <td style="white-space: nowrap">
                            <font face="Arial" size="-2">
[dashes are here]&#160;begin&#160;page&#160;19&#160;[dashes are here]
                            </font>
                        </td>
                    </tr>
                    <tr>
                        <td height="10">&#160;
                        </td>
                    </tr>
                </table>
            </CENTER>
            pellentesque, mollis mi et, malesuada est. Duis eleifend 
ullamcorper justo, vitae accumsan ante porta id.
        </font>
        <font face="Arial Unicode MS, sans-serif" size="-1">
            <blockquote>
                <font face="Arial Unicode MS, sans-serif" size="-1">
<p /><br />Yours,<br /></font>
                <font face="Arial Unicode MS, sans-serif" size="-1">
<p /><br />Me<br />
                </font><br />
            </blockquote>
        </font>
    </font>
</blockquote>
</font>

结束 HTML

4

2 回答 2

0

一种简单的方法是分别渲染 <p> 中的所有文本节点:

<xsl:template match="p//text()">
    <font face="Arial Unicode MS, sans-serif" size="-1">
        <xsl:value-of select="."/>
    </font>
</xsl:template>

p但是,这可能会影响、like等的其他后代的呈现hi。您必须为此类元素引入单独的模板。

于 2017-05-26T09:53:51.963 回答
0

为了扩展@friedemann_bach 的评论,我们这样做:我们在常规文本流中插入一个管道符号,另外还有一个 div,然后通过 css 将其移动到正确的位置(在左侧的边缘列中)。这是xslt:

<xsl:template match="pb">
    <xsl:choose>
        <xsl:when test="@break='no'">
            <xsl:text>|</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <xsl:text> | </xsl:text>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:element name="div">
        <xsl:attribute name="class">pageNumbers</xsl:attribute>
        <xsl:value-of select="concat('p. ', @n)"/>
    </xsl:element>
</xsl:template>

和 style.css:

.pageNumbers {
    float: left;
    margin-left: -12%;
    display: block;
}
于 2017-09-18T13:53:30.123 回答