【发布时间】:2013-08-19 10:06:07
【问题描述】:
我有一组必须包含在新元素中的顺序节点。示例:
<root>
<c>cccc</c>
<a gr="g1">aaaa</a> <b gr="g1">1111</b>
<a gr="g2">bbbb</a> <b gr="g2">2222</b>
</root>
必须用 fold 标记括起来,结果(在 XSLT 之后)为:
<root>
<c>cccc</c>
<fold><a gr="g1">aaaa</a> <b gr="g1">1111</b></fold>
<fold><a gr="g2">bbbb</a> <b gr="g2">2222</b></fold>
</root>
所以,我有一个“分组标签”(@gr)但不知道如何生成正确的折叠标签。
我正在尝试使用this question 或this other one 的线索...但是我有一个“分组标签”,所以我知道我的解决方案不需要使用key() 函数。
我的非通用解决方案是:
<xsl:template match="/">
<root>
<xsl:copy-of select="root/c"/>
<fold><xsl:for-each select="//*[@gr='g1']">
<xsl:copy-of select="."/>
</xsl:for-each></fold>
<fold><xsl:for-each select="//*[@gr='g2']">
<xsl:copy-of select="."/>
</xsl:for-each></fold>
</root>
</xsl:template>
我需要一个通用解决方案 (!),循环所有 @gr 并处理(身份)所有没有 @gr 的上下文...也许使用 身份转换。
另一个(未来的)问题是递归地执行此操作,折叠折叠。
【问题讨论】:
-
每个组的
gr值在root中是否总是不同的,如果不是,那么如果你有<root><a gr="g1">a1</a><b gr="g1">b1</b> <a gr="g2">a2</a><b gr="g2">b2</b> <a gr="g1">a3</a><b gr="g1">b3</b></root>,那么应该给你三个fold元素(a1/b1,a2 /b2, a3/b3) 还是两个 (a1/b1/a3/b3, a2/b2)? -
你可以使用“二”假设,但是在我的真正问题中,@gr 是一个不重复的序列,也就是说,如果一个序列停止它就不会再出现(下一组将是 g3,g2 之后不可能是 g1)。
-
好的,这个例子是你完整的 XML 文档还是你有几个不同的
root元素需要单独“折叠”? -
我编辑了...并将“邻居”添加到问题标题中。关于“折叠的折叠”现在不是问题,但我想我将来会遇到这个问题。