在XSLT中使用乱序标记(或分组元素)

  • 本文关键字:元素 XSLT xslt xslt-1.0
  • 更新时间 :
  • 英文 :


是否有可能在使用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解决方案)

你想做的可能的,但这不是一个好主意。这是一个更好的方法:

<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() &lt; 3]" />
  </div>
</xsl:template>
<xsl:template match="mydata">
  <xsl:value-of select="myvalue"/><br/>
</xsl:template>

JLRishe向您展示了解决方案。

你的问题是你认为你的样式表写开始和结束标签。XSLT不是这样做的:它写一个树。不能将半个节点写入结果树。考虑节点,而不是标签。

当遇到输出结构与输入结构不完全匹配的问题时,另一个有用的经验法则是样式表的结构应该反映输出的树状结构,而不是输入的树状结构。不要考虑"我该如何处理下一个ABC输入节点",而是考虑"我需要在结果树中生成一个XYZ节点,我该如何计算它的内容?"

相关内容

  • 没有找到相关文章

最新更新