是否可以使用1.0在XSLT中使用无序标记?我最初的猜测不是,因为它打破了XML的规则。
考虑具有X元素的XML数据,我想将这些X条目拆分为单个<div>
块中的3个块。 喜欢要做的就是这样,但显然它是完全无效的代码...
<div>
<xsl:for-each select="mydata">
<xsl:value-of select="myvalue"/><br/>
<xsl:if test="(position() mod 3)=0">
</div> <!-- This is invalid -->
<div> <!-- This is invalid -->
</xsl:if>
</xsl:for-each>
</div>
因此,对于8个元素,示例结果将是
<div>
value1<br/>
value2<br/>
value3<br/>
</div>
<div>
value4<br/>
value5<br/>
value6<br/>
</div>
<div>
value7<br/>
value8<br/>
</div>
如果上述情况根本不可能(因为我怀疑不是),有人可以建议一种可接受的方式将它们分组吗?
(请注意,这必须是XSLT 1.0解决方案)
答案 0 :(得分:2)
你想要做什么 是可能的,但这不是一个好主意。这是一种更好的方法:
<xsl:apply-templates select="mydata[position() mod 3 = 1]" mode="group" />
<!-- Separate templates -->
<xsl:template match="mydata" mode="group">
<div>
<xsl:apply-templates select=". | following-sibling::mydata[position() < 3]" />
</div>
</xsl:template>
<xsl:template match="mydata">
<xsl:value-of select="myvalue"/><br/>
</xsl:template>
答案 1 :(得分:2)
JLRishe向您展示了解决方案。
您的问题是您正在考虑将样式表编写为开始和结束标记。这不是XSLT的作用:它写了一棵树。您不能将半个节点写入结果树。想想节点,而不是标签。
当你遇到输出结构与输入结构不完全匹配的问题时,另一个有用的经验法则是样式表的结构应该反映输出的树结构,而不是输入的结构。不要想“我该如何处理下一个ABC输入节点”,而是“我需要在结果树中生成XYZ节点,我该如何计算其内容?”。