微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 在XPath XSL中执行“分组依据”查询

给出以下 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) &gt; 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”.

>修正错字.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。