我是 XSLT 的初学者。我正在尝试使用 Apache FOP 创建 AFP 文档。 我有一个像这样的输入 XML:
<letter>
<data>
<product>
<a>test</a>
<b>test1</b>
<product>
<charge>
<one-time-charge>
<amount>30</amount>
<info>MNO</info>
</one-time-charge>
</charge>
<product>
<charge>
<one-time-charge>
<amount>10</amount>
<info>XYZ</info>
</one-time-charge>
</charge>
</product>
<product>
<charge>
<one-time-charge>
<amount>20</amount>
<info>ABC</info>
</one-time-charge>
</charge>
</product>
</product>
</product>
</data>
</letter>
如您所见,“产品”标签有 3 个级别。 “产品”标签级别有时也可以是 2。
预期输出如下:
MNO 30
XYZ 10
ABC 20
无论级别如何,如何循环遍历“info”标签和“amount”标签?
更新:
使用下降轴后:
我能够从这段代码中获取值,但它不会为每个信息添加新行
<xsl:for-each select="data/product/product">
<fo:table-row>
<fo:table-cell>
<fo:block font-family="Arial" font-size="9pt" font-weight="normal">
<xsl:value-of select="descendant::one-time-charge/info"/>
</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block font-family="Arial" font-size="9pt" font-weight="normal">
<xsl:value-of select="descendant::one-time-charge/amount"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
输出如下:
MNO XYZ ABC 301020
必填:
MNO 30
XYZ 10
ABC 20
要按照建议使用后代轴,您应该执行以下操作:
<xsl:template match="/">
<table>
<xsl:for-each select="//one-time-charge">
<row>
<cell>
<xsl:value-of select="info"/>
</cell>
<cell>
<xsl:value-of select="amount"/>
</cell>
</row>
</xsl:for-each>
</table>
</xsl:template>