0

我正在尝试实现 FOP 以使用 XML 和 XSLT 文件输出 PDF。

我的问题是以下我需要修复一行中单词的位置(但不是通过使用表格),例如:

我有以下xml:

 <address>
    <Line1 length="32" noLine="5" col="60" />
    <Line2 length="32" noLine="6" col="60">Mr. John Kane</Line2 >
    <Line3 length="32" noLine="7" col="60">15 Street Springfield</Line3 >
    <Line4 length="32" noLine="8" col="60" />
    <Line5 length="32" noLine="9" col="60" />
    <Line6 length="6" noLine="10" col="60">75009</Line6 >
    <Line7 length="25" noLine="10" col="67">Freesberg</Line7 >
    <Line8 length="25" noLine="11" col="67">Idaho</Line8 >
  </address>
  1. 其中length是单词/句子的长度
  2. noLine是行号
  3. col是该行中单词/句子的开始位置

我做了这些行,但我似乎无法在行中的正确位置(col)插入单词/句子。

这是我的 xslt 的一部分:

<fo:block font-size="10" font-family="monospace">
<xsl:for-each select="*">
<xsl:variable name="currentNode" select ="name(.)"/>

<xsl:choose>
<xsl:when test="$currentNode = 'address'">
                                                <xsl:for-each select="*">
                                                    <xsl:variable name="length" select ="@length"/>
                                                    <xsl:variable name="noLine" select ="@noLine"/>
                                                    <xsl:variable name="col" select ="@col"/>
                                                    <xsl:variable name="precNoLig" select = "preceding-sibling::*[1]/@noLine"/>
                                                    <xsl:choose>
                                                        <xsl:when test="$precNoLig = $noLine">
                                                            <fo:block font-size="10" font-family="monospace" text-indent="60">
                                                                &#160;<xsl:value-of select="." />
                                                            </fo:block>
                                                        </xsl:when>
                                                        <xsl:otherwise>
                                                            <!--<fo:block font-size="10" font-family="monospace" >-->
                                                                &#x2028;<xsl:value-of select="." />
                                                            <!--</fo:block>-->
                                                        </xsl:otherwise>
                                                    </xsl:choose>
                                                </xsl:for-each>
    </xsl:when>
    </xsl:choose>

    </xsl:for-each>
    </fo:block>

这是预期的输出PDF

                                         Mr. John Kane
                                         15 Street Springfield


                                         75009 Freesberg
                                               Idaho

它在PDF(col) 中有以下位置:

<-----------------60-------------------->
<-----------------60-------------------->Mr. John Kane
<-----------------60-------------------->15 Street Springfield
<-----------------60-------------------->
<-----------------60-------------------->
<-----------------60-------------------->75009 Freesberg
<-----------------67-------------------------->Idaho

任何帮助,将不胜感激。

4

1 回答 1

1

这有点令人费解,但这应该可行:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:strip-space elements="*" />
  <xsl:output method="text"/>

  <xsl:variable name="sp" select="'                                                                                          '" />

  <xsl:template match="address/*">
    <xsl:variable name="value">
      <xsl:value-of select="." />
      <xsl:if test="following-sibling::*[1]/@noLine = @noLine">
        <xsl:value-of select="$sp" />
      </xsl:if>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="preceding-sibling::*[1]/@noLine = @noLine">
        <xsl:variable name="col" select="preceding-sibling::*[1]/@col + preceding-sibling::*[1]/@length" />
        <xsl:value-of select="concat(substring($sp,1,@col - $col),substring($value,1,@length))" />
      </xsl:when>
      <xsl:otherwise>
        <xsl:if test="preceding-sibling::*"><xsl:text>&#10;</xsl:text></xsl:if>
        <xsl:value-of select="concat(substring($sp,1,@col),substring($value,1,@length))" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

Line..要使此转换按原样工作,您的元素按顺序排列至关重要noLinecol因为它基于如何在前一个元素上填充它。如果它们出现故障,那将大错特错。

变量必须包含至少与您需要填充的sp空格一样多的空格,即任何lengthcol属性的最大值。这个解决方案不包括行尾的空格——实际上用尾随空格填充每一行更容易,这样它就可以填充给定的长度,但我认为最好不要这样做。

我只用给定的示例进行了尝试,如果它不适用于您所获得的任何其他输入,请告诉我,我会看看是否可以调整它。

编辑:我刚刚注意到您需要 PDF 格式,抱歉。我只是看着输出,并没有注意到格式。希望您可以将其调整为您需要的格式(它实际上与您已经尝试过的非常相似),但如果没有,我建议您手动创建一个代表您的输出的 PDF 并将该 PDF 的 XML 添加到您的问题。

于 2012-09-03T06:41:43.040 回答