gpt4 book ai didi

xml - 在 XPath XSL 中执行 "Group By"查询

转载 作者:数据小太阳 更新时间:2023-10-29 01:53:03 26 4
gpt4 key购买 nike

给定以下 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])]">

接下来可以迭代使用key来遍历group中的所有节点

<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', substring-before(@name, ':'))[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”。

  • 修正错别字。

关于xml - 在 XPath XSL 中执行 "Group By"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1929092/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com