我有一个嵌套列表,因此我希望标签也嵌套。
这是我的代码:
<!-- 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>
最后一个模板中的第一个数字( 1 .1。)我希望相对于父项,在这种情况下; “3”。
这是xml结构:
<list1>
<item>Test</item>
<item>Test</item>
<list2>
<item>Test</item>
<item>Test</item>
</list2>
<item>Test</item>
</list1>
这是输出:
1. Test
2. Test
2.1. Test
2.2. Test
3. Test
答案 0 :(得分:1)
对于嵌套列表,你可能应该使用level="multiple" count="X|Y"
但是如果不知道(a)你的XML源是什么样的,以及(b)上下文项是什么,我就不能更精确。指向您的命名模板的位置。
答案 1 :(得分:1)
可以获取所需的输出(例如)应用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>
这个最新的示例将正确地推动您进一步嵌套级别,就像 list3 一样。
答案 2 :(得分:1)
这个新变换被推广用于处理可变数量的列表。
输入样本:
<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