XSL-FO 中的缩进子节点

Indent children nodes in XSL-FO

我有XML这样的结构

<TestLog>
   <TestLogItem id="0" pid="-1">
      <Message>some message</Message>
   </TestLogItem>
   <TestLogItem id="1" pid="0">
      <Message>some message</Message>
   </TestLogItem>
   <TestLogItem id="2" pid="0">
      <Message>some message</Message>
   </TestLogItem>
   <TestLogItem id="3" pid="2">
      <Message>some message</Message>
   </TestLogItem>
</TestLog>

每个 TestLogItem 节点都有“id”和“pid(parentId)”。我在 table 行中显示消息,如果它是前一个节点的子节点,我只想缩进每条消息,即它的 PID 等于前一个节点 ID。我不知道如何在 xsl-fo 中将其转换为 pdf。

Any TestLogItem node can have any number of TestLogItem children nodes.

处理第一项,然后进行递归调用以查找第一项的子项:

<xsl:template match="Testlogitem">
    <fo:table-row...>
    </fo:table-row>
    <fo:table-row>
        <fo:table-cell padding-left="1 cm">
            <xsl:apply-templates select="following-sibling::*[@pid=./@id]"/>
        </fo:table-cell>
    <fo:table-row>
</xsl:template>

(您可能必须使用变量而不是引用 ./@id,现在无法测试)

编辑: 我已经添加了缩进代码。基本上,您为级别 1 创建一个 table 行。在该行内,您为级别 2 添加一个缩进行。

这是一个卑鄙的把戏:嵌套 table 会导致麻烦。另一种方法是使用两步过程:

  1. 使用 XSLT 将您的 XML 转换为嵌套结构。将嵌套级别写入输出 XML:

TestLogItem id="1" pid="0" level="2"

  1. 然后使用FO处理嵌套结构:

xsl:template match="Testlogitem/@level='2'"

这无需构建嵌套 table。