【发布时间】:2012-01-15 01:00:12
【问题描述】:
我想根据一些变量选择节点。 XML 代码:
<data>
<prot seq="AAA">
<node num="1">1345</node>
<node num="1">11245</node>
<node num="2">88885</node>
</prot>
<prot seq="BBB">
<node num="1">678</node>
<node num="1">456</node>
<node num="2">6666</node>
</prot>
<prot seq="CCC">
<node num="1">111</node>
<node num="1">222</node>
<node num="2">333</node>
</prot>
</data>
我想要的 XML
<output>
<prot seq="AAA">
<node num="1">1345</node>
<node num="2">88885</node>
</prot>
<prot seq="BBB">
<node num="1">678</node>
<node num="2">6666</node>
</prot>
<prot seq="CCC">
<node num="1">111</node>
<node num="2">333</node>
</prot>
</data>
所以,我的想法是使用 xsl:key 元素对节点进行分组,然后对每个节点执行一次。例如:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:key name="by" match="/data/prot" use="concat(@seq,'|',node/@num)"/>
<xsl:template match="/">
<root>
<xsl:apply-templates select="/data/prot"/>
</root>
</xsl:template>
<xsl:template match="/data/prot">
<xsl:for-each select="./node">
<xsl:for-each select="key('by',concat(current()/../@seq,'|',current()/@num))">
node <xsl:value-of select="./node" />
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
但输出不是我所期望的,我看不出我做错了什么。我宁愿保留 for-each 结构。就好像我没有正确使用 xsl:key 分组功能一样。
我得到的输出,不需要
<root>
node 1345
node 1345
node 678
node 678
node 111
node 111</root>
以及要测试的代码 http://www.xsltcake.com/slices/sgWUFu/20
谢谢!
【问题讨论】:
-
附带说明——请务必使用真正的 XSLT 处理器,而不是在您需要时可能会或可能不会使用的“蛋糕”,并且可能会出现很多问题。我推荐的好的 XSLT 处理器是:(XSLT 1.0) MSXML3,4,6, Saxon 6.5.4, .NET XslCompiledTransform, AltovaXML。 (XSLT 2.0) Saxon 9.xx、XQSharp、AltovaXML。
-
我只是在研究这个话题,所以我还没有回答。但是,关于您的回答,您是否参考 Web 客户端 xsltcake 进行测试?我在代码中使用的处理器是firefox,我主要是用这个web app来简化问题,如果我不能解决,那就贴在这里。
-
Gerard,我不会向任何朋友推荐 xslcake -- 它是 beta 版,不可靠(可能随时无法使用 -- 基本的 DOS 攻击会使它瘫痪很长时间) ,它使用不同的 XSLT 处理器产生不同的结果(取决于发送请求的浏览器),有时会产生荒谬的结果。作者自己警告用户有关此应用程序的状态和有用性。我建议使用好的 XSLT IDE,例如 XSelerator 或 at list Kernow。
-
实际上,由于我的处理器将是 firefox,所以 xsltcake 使用相同的处理器是合适的(只要我使用 firefox 访问它)。但你对它的 alpha 状态是正确的。对我来说,无需安装任何东西就可以使用它是一个非常有用的功能。也许有更多类似的网络服务处于更成熟的状态?
-
不,我猜主要原因是这是对 DOS 攻击的邀请。
标签: xslt grouping xslt-1.0 muenchian-grouping xslkey