0

使用 1.0 可以在 XSLT 中使用乱序标签吗?我最初的猜测不是,因为它违反了 XML 的规则。

考虑具有 X 元素的 XML 数据,我想将这些 X 条目拆分为单个块中的 3 个<div>块。我想做的是这样的事情,但显然它是完全无效的代码......

<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 解决方案)

4

2 回答 2

2

JLRishe 向您展示了解决方案。

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

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

于 2013-03-15T08:59:00.127 回答
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() &lt; 3]" />
  </div>
</xsl:template>

<xsl:template match="mydata">
  <xsl:value-of select="myvalue"/><br/>
</xsl:template>
于 2013-03-14T19:07:34.430 回答