XSL分组与变量
我在XML元素中有以下字符串:
<foodAndBeverageNutrient__>ENER-|APPROXIMATELY||120|E14++ENER-|APPROXIMATELY||501|KJO++PRO-|APPROXIMATELY||6.6|GRM++CHOAVL|APPROXIMATELY||6.9|GRM++SUGAR-|APPROXIMATELY||1.2|GRM++FAT|APPROXIMATELY||7.1|GRM++FASAT|APPROXIMATELY||1.3|GRM++FAMSCIS|APPROXIMATELY||3.8|GRM++FAPUCIS|APPROXIMATELY||2.0|GRM++FIBTG|APPROXIMATELY||1.2|GRM++SALTEQ|APPROXIMATELY||0.5|GRM</foodAndBeverageNutrient__>
使用以下XSL与令牌化我能够分开
<xsl:template name="foodAndBeverageNutrient_detail">
<xsl:for-each select="tokenize(., '\+\+')">
<xsl:variable name="foodAndBeverageNutrient" select="tokenize(., '\|')"/>
<nutrientDetail>
<nutrientTypeCode>
<xsl:value-of select="$foodAndBeverageNutrient[1]"/>
</nutrientTypeCode>
<xsl:if test="$foodAndBeverageNutrient[3] !=''">
<dailyValueIntakePercent>
<xsl:value-of select="$foodAndBeverageNutrient[3]"/>
</dailyValueIntakePercent>
</xsl:if>
<measurementPrecisionCode>
<xsl:value-of select="$foodAndBeverageNutrient[2]"/>
</measurementPrecisionCode>
<quantityContained measurementUnitCode="{$foodAndBeverageNutrient[5]}">
<xsl:value-of select="$foodAndBeverageNutrient[4]"/>
</quantityContained>
</nutrientDetail>
</xsl:for-each>
</xsl:template>
以下结果:
<foodAndBeverageNutrientInformation>
<preparationState>UNPREPARED</preparationState>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="E14">
<value>29</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="KJO">
<value>69</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="PRO-"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>1.4</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="CHOAVL"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>3.8</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="SUGAR-"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>3.4</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
但是我需要按NutrientType代码进行分组,因此结果是为每个NutrientType重复进行数量continitycontycontype这样的代码;
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="E14">
<value>29</value>
</measurementValue>
</quantityContained>
<quantityContained>
<measurementValue unitOfMeasure="KJO">
<value>122</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
我已经尝试了分组&lt; xsl:for-each-group,但看来我在XSL中的错误级别上,所以我仍然得到了“旧”结果。有没有办法与令牌化变量重复数量部分?
I have the following string within a XML element:
<foodAndBeverageNutrient__>ENER-|APPROXIMATELY||120|E14++ENER-|APPROXIMATELY||501|KJO++PRO-|APPROXIMATELY||6.6|GRM++CHOAVL|APPROXIMATELY||6.9|GRM++SUGAR-|APPROXIMATELY||1.2|GRM++FAT|APPROXIMATELY||7.1|GRM++FASAT|APPROXIMATELY||1.3|GRM++FAMSCIS|APPROXIMATELY||3.8|GRM++FAPUCIS|APPROXIMATELY||2.0|GRM++FIBTG|APPROXIMATELY||1.2|GRM++SALTEQ|APPROXIMATELY||0.5|GRM</foodAndBeverageNutrient__>
Using the following xsl with tokenize I am able to split
<xsl:template name="foodAndBeverageNutrient_detail">
<xsl:for-each select="tokenize(., '\+\+')">
<xsl:variable name="foodAndBeverageNutrient" select="tokenize(., '\|')"/>
<nutrientDetail>
<nutrientTypeCode>
<xsl:value-of select="$foodAndBeverageNutrient[1]"/>
</nutrientTypeCode>
<xsl:if test="$foodAndBeverageNutrient[3] !=''">
<dailyValueIntakePercent>
<xsl:value-of select="$foodAndBeverageNutrient[3]"/>
</dailyValueIntakePercent>
</xsl:if>
<measurementPrecisionCode>
<xsl:value-of select="$foodAndBeverageNutrient[2]"/>
</measurementPrecisionCode>
<quantityContained measurementUnitCode="{$foodAndBeverageNutrient[5]}">
<xsl:value-of select="$foodAndBeverageNutrient[4]"/>
</quantityContained>
</nutrientDetail>
</xsl:for-each>
</xsl:template>
giving me the following result:
<foodAndBeverageNutrientInformation>
<preparationState>UNPREPARED</preparationState>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="E14">
<value>29</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="KJO">
<value>69</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="PRO-"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>1.4</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="CHOAVL"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>3.8</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="SUGAR-"/>
<quantityContained>
<measurementValue unitOfMeasure="GR">
<value>3.4</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
But i have a requirement to group by nutrientType code, so the result is that the quantityContained is repeated for each nutrientType Code like this;
<foodAndBeverageNutrient>
<measurementPrecision>APPROXIMATELY</measurementPrecision>
<nutrientTypeCode iNFOODSCodeValue="ENER-"/>
<quantityContained>
<measurementValue unitOfMeasure="E14">
<value>29</value>
</measurementValue>
</quantityContained>
<quantityContained>
<measurementValue unitOfMeasure="KJO">
<value>122</value>
</measurementValue>
</quantityContained>
</foodAndBeverageNutrient>
I have tried with grouping <xsl:for-each-group but it looks like I am goruping on the wrong level in the xsl so I still end up with the 'old' result. IS there a way to group with the tokenized variables to repeat the quantity section?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
XSLT 3将您的数据分组为一系列数组的示例,
我不确定我是否选择了正确的数据,但是您会更好地知道您拥有哪个索引,例如
value
。An XSLT 3 example grouping your data as a sequence of arrays is
I am not quite sure I have selected the right data but you will better know at which index you have e.g. the
value
.