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 会导致麻烦。另一种方法是使用两步过程:
- 使用 XSLT 将您的 XML 转换为嵌套结构。将嵌套级别写入输出 XML:
TestLogItem id="1" pid="0" level="2"
- 然后使用FO处理嵌套结构:
xsl:template match="Testlogitem/@level='2'"
这无需构建嵌套 table。
我有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 会导致麻烦。另一种方法是使用两步过程:
- 使用 XSLT 将您的 XML 转换为嵌套结构。将嵌套级别写入输出 XML:
TestLogItem id="1" pid="0" level="2"
- 然后使用FO处理嵌套结构:
xsl:template match="Testlogitem/@level='2'"
这无需构建嵌套 table。