在XSL-FO中缩进子节点

时间:2015-02-10 04:55:15

标签: 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>
   <TestLogItem id="2" pid="0">
      <Message>some message</Message>
   </TestLogItem>
   <TestLogItem id="3" pid="2">
      <Message>some message</Message>
   </TestLogItem>
</TestLog>

每个 TestLogItem 节点都有&#34; id &#34;和&#34; pid (parentId)&#34;。我正在显示表行中的消息,并且只想缩小每个消息,如果它是前一个节点的子节点,即它的PID等于先前的节点ID。我无法弄清楚如何在xsl-fo中将其转换为pdf。

  

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

1 个答案:

答案 0 :(得分:1)

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

<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创建一个表行。在该行内,您为级别2添加一个具有缩进的行。

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

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

    TestLogItem id =&#34; 1&#34; PID =&#34; 0&#34;级=&#34; 2&#34;

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

      xsl:模板匹配=&#34; Testlogitem / @ level =&#39; 2&#39;&#34;

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