Xml 缩进XSL-FO中的子节点

Xml 缩进XSL-FO中的子节点,xml,xslt,xsd,xsl-fo,Xml,Xslt,Xsd,Xsl Fo,我有这样的XML结构 <TestLog> <TestLogItem id="0" pid="-1"> <Message>some message</Message> </TestLogItem> <TestLogItem id="1" pid="0"> <Message>some message</Message> </TestLogItem>

我有这样的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)”。我在表行中显示消息,只想缩进每个消息,如果它是前一个节点的子节点,即它的PID等于前一个节点ID。我不知道如何在xsl fo中将其转换为pdf

任何TestLogItem节点都可以有任意数量的TestLogItem子节点 节点


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

<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创建一个表行。在该行中,添加一个具有缩进的level 2行

这是一个肮脏的把戏:嵌套表可能会导致麻烦。另一种方法是使用两步流程:

  • 使用XSLT将XML转换为嵌套结构。将嵌套级别写入输出XML:
  • TestLogItem id=“1”pid=“0”level=“2”

  • 然后使用FO处理嵌套结构:
  • xsl:template match=“Testlogitem/@level='2'”


    这在不构建嵌套表的情况下工作

    使用
    current
    函数,即
    以下同级::*[@pid=current()/@id]
    我完成了这部分。但我不知道如何缩进孩子。我的意思是一个标签用于一级儿童,两个标签用于二级儿童,依此类推。你能修改一下你的答案并解释一下缩进吗?