Я пытаюсь создать несколько «продуктов», используя группировку с помощью ключа xsl:, используя приведенный ниже пример
<xsl:key name="product-by-pkg" match="GoodsItem" use="PackageTypeCode"
<xsl:for-each select="GoodsItem[count(. | key('product-by-pkg', PackageTypeCode)[1]) = 1]">
<product type="{PackageTypeCode}">
<quantity>
<!-- count current group -->
<xsl:value-of select="count(key('product-by-pkg', PackageTypeCode))" />
</quantity>
</product>
</xsl:for-each>
в этом источнике
<GoodsItem>
<PackageTypeCode>PC</PackageTypeCode>
</GoodsItem>
<GoodsItem>
<PackageTypeCode>PE</PackageTypeCode>
</GoodsItem>
<GoodsItem>
<PackageTypeCode>PC</PackageTypeCode>
</GoodsItem>
<GoodsItem>
<PackageTypeCode>XX</PackageTypeCode>
</GoodsItem>
<GoodsItem>
<PackageTypeCode>OA</PackageTypeCode>
<GoodsItem>
<PackageTypeCode>OF</PackageTypeCode>
</GoodsItem>
<GoodsItem>
<PackageTypeCode>CW</PackageTypeCode>
</GoodsItem>
то, что я пытаюсь сделать, это создайте тег продукта, используя приведенное выше преобразование и где PackageTypeCodes не являются YY или XX, или используя шаблон, где коды не соответствуют моим аргументам. Я в основном ищу для каждого, где PackageTypeCode! = XX типа вещей. Итак, я хочу l oop через все PackageTypeCodes, где я устанавливаю аргумент, для каких кодов создавать продукты. А затем второй, где я объединяю «неиспользованные» в первом аргументе продукта с @type P C
, чтобы мой результат выглядел примерно так:
<extraGoodsData>
<product type="PE">
<quantity>1</quantity>
</product>
<product type="OA">
<quantity>1</quantity>
</product>
<product type="OF">
<quantity>1</quantity>
</product>
<product type="CW">
<quantity>1</quantity>
</product>
</extraGoodsData>
и я хочу, чтобы XX учитывался в P C по умолчанию, поэтому несоответствие моим аргументам в первой итерации должно использоваться во второй для создания
<product type="PC">
<!--quantity should be equal to the number of PC + non matching PackageTypeCodes in the first iteration-->
<quantity>3</quantity>
</product>
и окончательного результата вот так
<extraGoodsData>
<product type="PE">
<quantity>1</quantity>
</product>
<product type="OA">
<quantity>1</quantity>
</product>
<product type="OF">
<quantity>1</quantity>
</product>
<product type="CW">
<quantity>1</quantity>
</product>
<!--number of PC PackageTypeCodes + non matching in the first count-->
<product type="PC">
<quantity>3</quantity>
</product>
</extraGoodsData>
возможно ли это в XSLT1.0?
EDIT -------
все packageTypeCodes, которые не соответствуют тому, что я хочу, поэтому например, for each должно выполняться для всего, что равно PE, OA, CW, OF и всему, что я хочу добавить к этому. Те, которые не включены, например, P C, XX, YY, ZZ и c, должны быть объединены под P C и в количестве, равном количеству PC + XX + YY + ZZ, но под 1 тегом продукта. .
<!--for PE OA OF CW-->
<xsl:for-each select="GoodsItem[count(. | key('product-by-pkg', PackageTypeCode)[1]) = 1]">
<product type="{PackageTypeCode}">
<quantity>
<!-- count current group -->
<xsl:value-of select="count(key('product-by-pkg', PackageTypeCode))" />
</quantity>
</product>
</xsl:for-each>
<!--for PC,XX,ZZ,YY etc-->
<xsl:for-each select="GoodsItem[count(. | key('product-by-pkg', PackageTypeCode)[1]) = 1]">
<product type="PC">
<quantity>
<xsl:value-of select="count(key('product-by-pkg', PackageTypeCode))" />
</quantity>
</product>
</xsl:for-each>