【发布时间】:2011-07-03 12:20:49
【问题描述】:
我正在尝试处理具有多个不同状态组的 xml 文件,例如
<root>
<childgroup>16</childgroup>
<setstate>init</setstate>
<child1>...</child1>
<child2>...</child2>
<setstate>process<setstate>
<child2>...</child2>
<child3>...</child3>
.....
<childgroup>17</childgroup>
...
我真正需要的是得到类似的东西
<childgroup no="16">
<state statename="init">
<child1>...</child1>
<child2>...</child2>
</state>
<state statename="process">
<child2>...</child2>
<child3>...</child3>
</state>
</childgroup>
<childgroup no="17">
...
我已经完成了简单的部分,即向所有子元素添加“chgrpno”属性和 stateid 属性(它复制除子组和状态之外的所有元素,将属性添加到这两个元素。
<xsl:template match="/">
<xsl:apply-templates mode="numb"/>
</xsl:template>
这行得通,结果所有孩子都有属性,所以我可以在下一次传递中重新组合它们,并且状态有数字,所以我以后可以做同样的事情。但是当我尝试这样做时,试图以“临时文件”来效仿 M.Kay 的例子
<xsl:variable name="nmb">
<xsl:apply-templates mode="numb"/>
</xsl:variable>
<xsl:template match="/">
<xsl:copy-of select="$nmb"/>
</xsl:template>
然后它只是将原件返回给我,而我在第一遍中所做的所有更改都消失了。那么我在这里做错了什么?
我使用 XSLT 1.0,而不是明确使用 XSLT 2.0。
(编辑:当然是我命名了变量,忘了在这里复制它)。
【问题讨论】:
-
好问题,+1。有关 XSLT 1.0 中必需的 RTF 转换为临时树的解释,请参阅我的答案。此外,还提供了两遍 XSLT 1.0 处理的完整代码示例。