xslt - XSLT 2.0 一组多级
问题描述
问题是我如何获得我想要的输出?
我成功地为每个组创建了一个组,<LogistiekeDeelEenheid>
但是该<DeeleenheidAantal>
字段也必须填充一个值。对于<LogistiekeDeelEenheid>
000094<DeeleenheidAantal>
必须用 xsl 中的 10 填充<Value AttributeID = "att_NumberInCombiProduct"> 10 </Value>
才能进行转换。并且<LogistiekeDeelEenheid>
000072<DeeleenheidAantal>
必须用 20 来填充<Value AttributeID = "att_NumberInCombiProduct"> 20 </Value>
而<LogistiekeDeelEenheid>
000032<DeeleenheidAantal>
必须用 35 来填充<Value AttributeID = "att_NumberInCombiProduct"> 35 </Value>
要转换的 xml:
<Test>
<Product ID="LV-10432200" UserTypeID="CombiLogistiekeVariant">
<Name>1 - TEST1</Name>
<ProductCrossReference ProductID="Product-10430948"
Type="rpp_CombiLogistiekeVariant2Product">
<KeyValue KeyID="key_ProductGTIN">2311111</KeyValue>
<KeyValue KeyID="key_Productnummer">000094</KeyValue>
<MetaData>
<Value AttributeID="att_AantalInCombiProduct">10</Value>
</MetaData>
</ProductCrossReference>
<ProductCrossReference ProductID="Product-10431710"
Type="rpp_CombiLogistiekeVariant2Product">
<KeyValue KeyID="key_ProductGTIN">5449000018885</KeyValue>
<KeyValue KeyID="key_Productnummer">000072</KeyValue>
<MetaData>
<Value AttributeID="att_AantalInCombiProduct">20</Value>
</MetaData>
</ProductCrossReference>
<ProductCrossReference ProductID="Product-10431738"
Type="rpp_CombiLogistiekeVariant2Product">
<KeyValue KeyID="key_ProductGTIN">54419780</KeyValue>
<KeyValue KeyID="key_Productnummer">000032</KeyValue>
<MetaData>
<Value AttributeID="att_AantalInCombiProduct" Changed="true">35
</Value>
</MetaData>
</ProductCrossReference>
<Values>
<Value AttributeID="att_Productnummer">000001</Value>
<Value AttributeID="att_LVStatus" ID="2">Inactief</Value>
<Value AttributeID="att_LVOmschrijving">TEST Config 1</Value>
<Value AttributeID="att_LVNummer">1</Value>
</Values>
<Product ID="Pack-10432212" UserTypeID="Kleinverpakking">
<Name>21 - Kleinverpakking</Name>
<ProductCrossReference ProductID="LV-10432200"
Type="rpp_Verpakking-Kleinverpakking2Kleiner">
<MetaData>
<Value AttributeID="att_AantalInVerpakking">1</Value>
</MetaData>
</ProductCrossReference>
<Values>
<Value AttributeID="att_VerpakkingBreedte" UnitID="unece.unit.CMT">1</Value>
<Value AttributeID="att_VerpakkingGewichtBruto" UnitID="181">1
</Value>
<Value AttributeID="att_LVNummer">1</Value>
<Value AttributeID="att_VerpakkingHoogte" UnitID="unece.unit.CMT">1</Value>
<Value AttributeID="att_Productnummer">000001</Value>
<Value AttributeID="att_VerpakkingDiepte" UnitID="unece.unit.CMT">1</Value>
<Value AttributeID="att_PrimaireGTIN" Derived="true">Primaire GTIN
Ontbreekt
</Value>
</Values>
</Product>
</Product>
</Test>
并且必须转换为:
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000094</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>10</DeeleenheidAantal>
</LogistiekeDeelEenheid>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000072</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>20</DeeleenheidAantal>
</LogistiekeDeelEenheid>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000032</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>35</DeeleenheidAantal>
</LogistiekeDeelEenheid>
我的 xslt:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" indent="yes" method="xml"/>
<xsl:template match="/">
<xsl:apply-templates select="Test/Product"/>
</xsl:template>
<xsl:template match="Test/Product">
<xsl:for-each-group select="//ProductCrossReference[@Type='rpp_CombiLogistiekeVariant2Product']" group-by="//ProductCrossReference/KeyValue[@KeyID='key_Productnummer']">
<xsl:variable select="current-grouping-key()" name="Productnummer"/>
<test>
<xsl:value-of select="../Name"/>
</test>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>
<xsl:value-of select="$Productnummer"/>
</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>
<xsl:value-of select="../ProductCrossReference/MetaData/Value[@AttributeID='att_AantalInCombiProduct']"/>
</DeeleenheidAantal>
</LogistiekeDeelEenheid>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
但是,如果我使用此代码,我会得到不正确的结果。第一个应该是 10 第二个应该是 20 第三个应该是 35
<?xml encoding="UTF-8" version="1.0"?>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000094</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>10 20 35
</DeeleenheidAantal>
</LogistiekeDeelEenheid>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000072</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>10 20 35
</DeeleenheidAantal>
</LogistiekeDeelEenheid>
<test>1 - TEST1</test>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>000032</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>10 20 35
</DeeleenheidAantal>
</LogistiekeDeelEenheid>
解决方案
我在评论中提出的建议,调整为您稍后发布的代码,将导致
<xsl:template match="Test/Product">
<xsl:for-each-group select="ProductCrossReference[@Type='rpp_CombiLogistiekeVariant2Product']"
group-by="KeyValue[@KeyID='key_Productnummer']">
<xsl:variable select="current-grouping-key()" name="Productnummer"/>
<test>
<xsl:value-of select="../Name"/>
</test>
<LogistiekeDeelEenheid>
<DeeleenheidArtikelNummer>
<xsl:value-of select="$Productnummer"/>
</DeeleenheidArtikelNummer>
<DeeleenheidLogistiekeVariant>0</DeeleenheidLogistiekeVariant>
<DeeleenheidCode>1</DeeleenheidCode>
<DeeleenheidLinkType>4</DeeleenheidLinkType>
<DeeleenheidAantal>
<xsl:value-of select="MetaData/Value[@AttributeID='att_AantalInCombiProduct']"/>
</DeeleenheidAantal>
</LogistiekeDeelEenheid>
</xsl:for-each-group>
</xsl:template>
在https://xsltfiddle.liberty-development.net/ei5R4tY我将建议应用于您编辑的输入样本,结果具有例如<DeeleenheidAantal>10</DeeleenheidAantal>
,即结果中该项目的单个值。
我必须承认您的嵌套样本数据对我来说仍然不清楚,但请随时进一步编辑您的问题并澄清您想要处理和分组的数据。
推荐阅读
- python - 为什么我的 A*Atranspose 和 Atranspose*A 的特征值不匹配?
- hadoop - 我怎么知道在 /mnt/yarn/usercache 和 /var/log/hadoop-yarn/containers 目录中删除什么是安全的?
- linq - EF Core 对 SQL 请求的正确解释
- python - 使用 Python 从具有某种结构的 txt 中提取数据
- python-3.x - 为什么颜色条没有出现在我的 cloropleth 地图中?
- sql-server - 将字符串连接到 @declare
- python - 如何从 aiohttp 响应中获取 IP 地址
- javascript - 在 swiftui 中评估 JavaScript
- javascript - 尝试增加分数时获得 NaN
- javascript - html href 和服务器监听器上的 fetch 调用之间的区别