Xml 带数字标签的嵌套列表
我有一个嵌套列表,因此我希望标签也嵌套 这是我的代码:Xml 带数字标签的嵌套列表,xml,xslt,xpath,xsl-fo,Xml,Xslt,Xpath,Xsl Fo,我有一个嵌套列表,因此我希望标签也嵌套 这是我的代码: <!-- For first list --> <xsl:template name="list1-label"> <xsl:number format="1."/> </xsl:template> <!-- The nestled list --> <xsl:template name="list2-label"> <xsl:number fo
<!-- For first list -->
<xsl:template name="list1-label">
<xsl:number format="1."/>
</xsl:template>
<!-- The nestled list -->
<xsl:template name="list2-label">
<xsl:number format="1.1."/>
</xsl:template>
对于嵌套列表,您可能应该使用
level=“multiple”count=“X | Y”
,但如果不知道(a)您的XML源是什么样的,以及(b)在调用命名模板时上下文项是什么,我就不能比这更精确了。可以获得所需的输出(例如)应用xsl:number
的@from和@count的高级属性。下面是一个工作示例,您可以从中开始:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="list1/item">
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="list1/list2/item">
<xsl:text>	</xsl:text>
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="list2" count="list2/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
.
.
.
如果要简化匹配模式,请执行以下操作:
<xsl:template match="list1">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="list1/item">
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="list2/item">
<xsl:text>	</xsl:text>
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="list2" count="list2/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
.
.
.
这个最新的示例将正确地驱动您进一步嵌套级别,就像使用列表3一样。这个新的转换被推广到处理可变数量的列表 输入样本:
<list1>
<item>Test</item>
<item>Test</item>
<list2>
<item>Test</item>
<list3>
<item>Test</item>
<item>Test</item>
</list3>
<item>Test</item>
<list3>
<item>Test</item>
</list3>
<item>Test</item>
</list2>
<item>Test</item>
</list1>
<xsl:template match="list1">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="list1/item">
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="list2/item">
<xsl:text>	</xsl:text>
<xsl:number level="any" from="list1" count="list1/item"/>
<xsl:text>.</xsl:text>
<xsl:number level="any" from="list2" count="list2/item"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:template>
<list1>
<item>Test</item>
<item>Test</item>
<list2>
<item>Test</item>
<list3>
<item>Test</item>
<item>Test</item>
</list3>
<item>Test</item>
<list3>
<item>Test</item>
</list3>
<item>Test</item>
</list2>
<item>Test</item>
</list1>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*[starts-with(name(),'list')]">
<xsl:apply-templates>
<xsl:with-param name="tab" select="true()"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="item">
<xsl:param name="lvl" select="count(ancestor::*)"/>
<xsl:param name="tab" select="false()"/>
<!-- insert entry point tab -->
<xsl:apply-templates select="text()[$tab and $lvl > 1]" mode="tab">
<xsl:with-param name="lvl" select="$lvl - 1"/>
</xsl:apply-templates>
<!-- recurse levels -->
<xsl:variable name="name" select="name(ancestor::*[$lvl])"/>
<xsl:number level="any" from="*[name()=$name]"
count="*[name()=$name]/item"/>
<xsl:text>.</xsl:text>
<xsl:apply-templates select="self::item[$lvl > 1]">
<xsl:with-param name="lvl" select="$lvl - 1"/>
</xsl:apply-templates>
<!-- print value -->
<xsl:if test="$lvl = 1">
<xsl:text> </xsl:text>
<xsl:value-of select="."/>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:template>
<xsl:template match="text()" mode="tab">
<xsl:param name="lvl"/>
<xsl:text>	</xsl:text>
<xsl:apply-templates select="self::text()[$lvl>1]" mode="tab">
<xsl:with-param name="lvl" select="$lvl - 1"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
1. Test
2. Test
2.1. Test
2.1.1. Test
2.1.2. Test
2.2. Test
2.2.1. Test
2.3. Test
3. Test