我有像这样的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子节点 节点
答案 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添加一个具有缩进的行。
这是一个肮脏的伎俩:嵌套表可能会导致麻烦。另一种方法是使用两步过程:
TestLogItem id =&#34; 1&#34; PID =&#34; 0&#34;级=&#34; 2&#34;
xsl:模板匹配=&#34; Testlogitem / @ level =&#39; 2&#39;&#34;
这可以在不构建嵌套表的情况下工作。