Dynamic XSLT 2.0 group by的动态参数
我得到了这个输入Dynamic XSLT 2.0 group by的动态参数,dynamic,group-by,xslt-2.0,params,Dynamic,Group By,Xslt 2.0,Params,我得到了这个输入 <?xml version="1.0" encoding="UTF-8"?> <result> <datapoint poiid="2492" period="2004" value="1240"/> <datapoint poiid="2492" period="2005" value="1290"/> <datapoint poiid="2492" period="2006" value="1280"/>
<?xml version="1.0" encoding="UTF-8"?>
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
我使用的是XSLT2.0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@poiid">
<node type="poiid" id="{@poiid}">
<xsl:for-each select="current-group()">
<node type="period" id="{@period}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
将其转换为
<?xml version="1.0" encoding="UTF-8"?>
<node type="poiid" id="2492">
<node type="period" id="2004" value="1240"/>
<node type="period" id="2005" value="1290"/>
<node type="period" id="2006" value="1280"/>
<node type="period" id="2007" value="1320"/>
<node type="period" id="2008" value="1330"/>
<node type="period" id="2009" value="1340"/>
<node type="period" id="2010" value="1340"/>
<node type="period" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="period" id="2004" value="1120"/>
<node type="period" id="2005" value="1120"/>
<node type="period" id="2006" value="1100"/>
<node type="period" id="2007" value="1100"/>
<node type="period" id="2008" value="1100"/>
<node type="period" id="2009" value="1110"/>
<node type="period" id="2010" value="1105"/>
<node type="period" id="2011" value="1105"/>
</node>
工作顺利
我被卡住的地方是当我试图让它更有活力的时候。现实生活中的输入对于每个数据点有6个属性,而不是3个,并且用例需要动态设置分组参数的可能性
我试着使用参数
<xsl:param name="k1" select="'poiid'"/>
<xsl:param name="k2" select="'period'"/>
但是将它们传递给xslt的其余部分是我无法正确理解的。下面的代码不起作用,但希望能澄清我在寻找什么
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@{$k1}">
<node type="{$k1}" id="@{$k1}">
<xsl:for-each select="current-group()">
<node type="{$k2}" id="@{$k2}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
感谢您的帮助。以下是如何做到这一点的方法:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="k1" select="'poiid'"/>
<xsl:param name="k2" select="'period'"/>
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@*[name()= $k1]">
<node type="{$k1}" id="{@*[name() = $k1]}">
<xsl:for-each select="current-group()">
<node type="{k2}" id="{@*[name()= $k2]}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
<node type="poiid" id="2492">
<node type="" id="2004" value="1240"/>
<node type="" id="2005" value="1290"/>
<node type="" id="2006" value="1280"/>
<node type="" id="2007" value="1320"/>
<node type="" id="2008" value="1330"/>
<node type="" id="2009" value="1340"/>
<node type="" id="2010" value="1340"/>
<node type="" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="" id="2004" value="1120"/>
<node type="" id="2005" value="1120"/>
<node type="" id="2006" value="1100"/>
<node type="" id="2007" value="1100"/>
<node type="" id="2008" value="1100"/>
<node type="" id="2009" value="1110"/>
<node type="" id="2010" value="1105"/>
<node type="" id="2011" value="1105"/>
</node>
生成所需的正确结果:
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
<node type="poiid" id="2492">
<node type="" id="2004" value="1240"/>
<node type="" id="2005" value="1290"/>
<node type="" id="2006" value="1280"/>
<node type="" id="2007" value="1320"/>
<node type="" id="2008" value="1330"/>
<node type="" id="2009" value="1340"/>
<node type="" id="2010" value="1340"/>
<node type="" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="" id="2004" value="1120"/>
<node type="" id="2005" value="1120"/>
<node type="" id="2006" value="1100"/>
<node type="" id="2007" value="1100"/>
<node type="" id="2008" value="1100"/>
<node type="" id="2009" value="1110"/>
<node type="" id="2010" value="1105"/>
<node type="" id="2011" value="1105"/>
</node>
以下是操作方法:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="k1" select="'poiid'"/>
<xsl:param name="k2" select="'period'"/>
<xsl:template match="result">
<xsl:for-each-group select="datapoint" group-by="@*[name()= $k1]">
<node type="{$k1}" id="{@*[name() = $k1]}">
<xsl:for-each select="current-group()">
<node type="{k2}" id="{@*[name()= $k2]}" value="{@value}"/>
</xsl:for-each>
</node>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
在提供的XML文档上应用此转换时:
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
<node type="poiid" id="2492">
<node type="" id="2004" value="1240"/>
<node type="" id="2005" value="1290"/>
<node type="" id="2006" value="1280"/>
<node type="" id="2007" value="1320"/>
<node type="" id="2008" value="1330"/>
<node type="" id="2009" value="1340"/>
<node type="" id="2010" value="1340"/>
<node type="" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="" id="2004" value="1120"/>
<node type="" id="2005" value="1120"/>
<node type="" id="2006" value="1100"/>
<node type="" id="2007" value="1100"/>
<node type="" id="2008" value="1100"/>
<node type="" id="2009" value="1110"/>
<node type="" id="2010" value="1105"/>
<node type="" id="2011" value="1105"/>
</node>
生成所需的正确结果:
<result>
<datapoint poiid="2492" period="2004" value="1240"/>
<datapoint poiid="2492" period="2005" value="1290"/>
<datapoint poiid="2492" period="2006" value="1280"/>
<datapoint poiid="2492" period="2007" value="1320"/>
<datapoint poiid="2492" period="2008" value="1330"/>
<datapoint poiid="2492" period="2009" value="1340"/>
<datapoint poiid="2492" period="2010" value="1340"/>
<datapoint poiid="2492" period="2011" value="1335"/>
<datapoint poiid="2493" period="2004" value="1120"/>
<datapoint poiid="2493" period="2005" value="1120"/>
<datapoint poiid="2493" period="2006" value="1100"/>
<datapoint poiid="2493" period="2007" value="1100"/>
<datapoint poiid="2493" period="2008" value="1100"/>
<datapoint poiid="2493" period="2009" value="1110"/>
<datapoint poiid="2493" period="2010" value="1105"/>
<datapoint poiid="2493" period="2011" value="1105"/>
</result>
<node type="poiid" id="2492">
<node type="" id="2004" value="1240"/>
<node type="" id="2005" value="1290"/>
<node type="" id="2006" value="1280"/>
<node type="" id="2007" value="1320"/>
<node type="" id="2008" value="1330"/>
<node type="" id="2009" value="1340"/>
<node type="" id="2010" value="1340"/>
<node type="" id="2011" value="1335"/>
</node>
<node type="poiid" id="2493">
<node type="" id="2004" value="1120"/>
<node type="" id="2005" value="1120"/>
<node type="" id="2006" value="1100"/>
<node type="" id="2007" value="1100"/>
<node type="" id="2008" value="1100"/>
<node type="" id="2009" value="1110"/>
<node type="" id="2010" value="1105"/>
<node type="" id="2011" value="1105"/>
</node>
Dimitre,group by=“@POID”不是动态的,类似group by=“{@*[name()=$k1]}”的替代项无效。我仍然被卡住了:(但是,您的解决方案的其他部分提供了有用的见解。感谢Sophileon,group by
属性已经是一个XPath表达式,因此不要在其中使用大括号,只需使用group by=“@*[name()=$k1]”
。这样,Dimitre的建议应该可以满足您的要求。@Phileon,是的,这些地方太多了,我忽略了一个。现在修复了。Dimitre,group by=“@poid”不是动态的,类似group by=“{@*[name()=$k1]}”的替代方法无效。我仍然被卡住了:(不过,解决方案的其他部分提供了有用的见解。感谢Sophileon,group by
属性已经是一个XPath表达式,因此不要在其中使用大括号,只需使用group by=“@*[name()=$k1]”
。这样,Dimitre的建议应该可以满足您的要求。@Phileon,是的,这些地方太多了,我忽略了一个。现在修复。