如何创建嵌套XSLT输出?需传入Page Count和Detail Count参数
没问题,我来帮你实现这个需求!我们可以通过XSLT的参数传递和循环逻辑,轻松生成你需要的嵌套XML结构。
实现基于参数的嵌套XML结构生成
首先,我们需要在XSLT中定义两个接收外部输入的参数,再通过循环和位置计算来生成对应层级的节点。
完整XSLT代码示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 定义两个可外部传入的参数,同时设置默认值备用 --> <xsl:param name="PageCount" select="1"/> <xsl:param name="DetailCount" select="3"/> <xsl:template match="/"> <LayOut> <!-- 循环生成每个Pages节点 --> <xsl:for-each select="1 to $PageCount"> <Pages> <!-- 当前页码 --> <Page><xsl:value-of select="."/></Page> <!-- 生成当前页对应的所有Detail元素 --> <xsl:for-each select="1 to $DetailCount"> <Detail> <!-- 计算连续的Detail编号:(当前页-1)*每页Detail数 + 当前Detail位置 --> <xsl:value-of select="(current() - 1)*$DetailCount + position()"/> </Detail> </xsl:for-each> </Pages> </xsl:for-each> </LayOut> </xsl:template> </xsl:stylesheet>
关键逻辑解释
- 参数定义:通过
<xsl:param>声明PageCount(总页数)和DetailCount(每页Detail数量),支持外部传入值,也设置了默认值方便测试。 - 外层循环:
1 to $PageCount会生成从1到总页数的序列,每个值对应一个<Pages>节点,<Page>的内容就是当前循环的页码。 - 内层循环:每个
<Pages>下生成指定数量的<Detail>元素,通过(current() - 1)*$DetailCount + position()计算连续的编号,确保Detail序号跨页后不会重置(比如第2页的第一个Detail编号就是(2-1)*3+1=4,和你给出的示例完全匹配)。
测试效果
当传入PageCount=2、DetailCount=3时,输出的XML结构如下:
<?xml version="1.0" encoding="UTF-8"?> <LayOut> <Pages> <Page>1</Page> <Detail>1</Detail> <Detail>2</Detail> <Detail>3</Detail> </Pages> <Pages> <Page>2</Page> <Detail>4</Detail> <Detail>5</Detail> <Detail>6</Detail> </Pages> </LayOut>
如果需要调整参数,只需要在调用XSLT处理器时传入对应值即可,比如用Saxon处理器的命令示例:
java -jar saxon.jar -s:input.xml -xsl:your-stylesheet.xsl -o:output.xml PageCount=5 DetailCount=4
内容的提问来源于stack exchange,提问作者Harisudhan
相关产品推荐
相关产品推荐

