xml – 在XPath XSL中执行“分组依据”查询
发布时间:2020-12-16 05:36:20 所属栏目:百科 来源:网络整理
导读:给出以下 XML: results name="queryResults" int name="intfield1:[* TO 10]"11/int int name="intfield2:[10 TO 20]"9/int int name="intfield1:[10 TO 20]"12/int /results 我想生成这个XML: results field name="numberfield1" value name="[* TO 10]"1
给出以下
XML:
<results name="queryResults"> <int name="intfield1:[* TO 10]">11</int> <int name="intfield2:[10 TO 20]">9</int> <int name="intfield1:[10 TO 20]">12</int> </results> 我想生成这个XML: <results> <field name="numberfield1"> <value name="[* TO 10]">11</value> <value name="[10 TO 10]">12</value> </field> <field name="numberfield2"> <value name="[10 TO 20]">9</value> </field> </results> 我想不出怎么在XSL中这样做主要是因为我想要按数字字段分组..所有我能想到的是这样的: <xsl:if test="count(results/int) > 0"> <results> <xsl:for-each select="results/int"> <field> <xsl:attribute name="name"> <xsl:value-of select="substring-before(@name,':')"/></xsl:attribute> <value> <xsl:attribute name="name"> <xsl:value-of select="substring-after(@name,':') "/> </xsl:attribute> <xsl:value-of select="."/> </value> </field> </xsl:for-each> </results> </xsl:if> 然而,这不会产生很好的分组列表,而是我得到这个: <results> <field name="numberfield1"> <value name="[* TO 10]">11</value> </field> <field name="numberfield2"> <value name="[10 TO 20]">9</value> </field> <field name="numberfield1"> <value name="[10 TO 10]">12</value> </field> </results> 如果有人可以朝着正确的方向偷我……那会很棒吗? 谢谢
要在XSLT 1.0中执行此操作,您必须使用名为
“muenchian grouping”的技术.首先创建要分组的节点的键
<xsl:key name="intfield" match="int" use="substring-before(@name,':')" /> 接下来,您遍历所有节点,但只选择碰巧在相关组中的第一个节点 <xsl:for-each select="int[generate-id() = generate-id(key('intfield',substring-before(@name,':'))[1])]"> 接下来,您可以迭代使用密钥迭代组中的所有节点 <xsl:variable name="intfieldname" select="substring-before(@name,':')"/> <xsl:for-each select="key('intfield',$intfieldname)"> 把这一切放在一起给出了 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml"/> <xsl:key name="intfield" match="int" use="substring-before(@name,':')"/> <xsl:template match="/results"> <results> <xsl:for-each select="int[generate-id() = generate-id(key('intfield',':'))[1])]"> <xsl:variable name="intfieldname" select="substring-before(@name,':')"/> <field> <xsl:attribute name="name"> <xsl:value-of select="$intfieldname"/> </xsl:attribute> <xsl:for-each select="key('intfield',$intfieldname)"> <value> <xsl:attribute name="name"> <xsl:value-of select="substring-after(@name,':')"/> </xsl:attribute> <xsl:value-of select="."/> </value> </xsl:for-each> </field> </xsl:for-each> </results> </xsl:template> </xsl:stylesheet> 在您的示例中,“intfield”变为“numberfield”.在上面的例子中,我将名称保留为“intfield”. >修正错字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |