У меня есть входной документ, где я хочу только извлечь элементы с префиксом p, T и C - PullRequest
0 голосов
/ 31 октября 2018

Я новичок в XML и XSLT, и у меня есть входной документ, в котором я хочу извлечь элементы с префиксом p, T и C и подсчитать количество серийных номеров с корневым SKU и списком. Я пробовал много способов, но не могу заставить его работать, и мне нужна помощь / предложения.

  • В моем XSLT я копирую все элементы с safix ppp в выходной файл.
  • В моем XSLT я копирую все элементы с safix c00 в выходной файл.
  • В моем XSLT я копирую все элементы с saefix t0 в выходной файл.

Любая помощь очень ценится.
Спасибо и с нетерпением ждем ответов.

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <row>
        <product.name>iPhoneX</product.name>
        <category>phone</category>
        <serial>P0001</serial>
    </row>
    <row>
        <product.name>iPadMini</product.name>
        <category>tablet</category>
        <serial>T0001</serial>
    </row>
    <row>
        <product.name>iPadMini</product.name>
        <category>tablet</category>
        <serial>T0002</serial>
    </row>
    <row>
        <product.name>iPhoneX</product.name>
        <category>phone</category>
        <serial>P0002</serial>
    </row>
    <row>
        <product.name>iMacPro</product.name>
        <category>computer</category>
        <serial>C0001</serial>
    </row>
    <row>
        <product.name>iMacPro</product.name>
        <category>computer</category>
        <serial>C0002</serial>
    </row>
    <row>
        <product.name>iPhoneX</product.name>
        <category>phone</category>
        <serial>P0003</serial>
    </row>
    <row>
        <product.name>iPhoneX</product.name>
        <category>phone</category>
        <serial>P0004</serial>
    </row>
    <row>
        <product.name>iPhoneX</product.name>
        <category>phone</category>
        <serial>P0005</serial>
    </row>

Ожидаемый вывод в следующем формате:

<?xml version="1.0" encoding="UTF-8"?>
<Inventory>
    <SKU>
        <category>phone</category>
        <product.name>iPhoneX</product.name>
        <product.count>5</product.count>
        <list>P0001</list>
        <list>P0002</list>
        <list>P0003</list>
        <list>P0004</list>
        <list>P0005</list>
    </SKU>
    <SKU>
        <category>tablet</category>
        <product.name>iPadMini</product.name>
        <product.count>2</product.count>
        <list>T0001</list>
        <list>T0002</list>
    </SKU>
    <SKU>
        <category>computer</category>
        <product.name>iMacPro</product.name>
        <product.count>2</product.count>
        <list>C0001</list>
        <list>C0002</list>
    </SKU>
</Inventory>

Я пробовал много способов, но не могу заставить его работать, и мне нужна помощь / предложения.

Любая помощь очень ценится.
Спасибо и с нетерпением ждем ответов.

Что я могу сделать?

1 Ответ

0 голосов
/ 01 ноября 2018

Как указано в комментарии, кажется, что простая проблема группировки, которую вы могли бы решить в XSLT 2 или 3 с помощью for-each-group group-by:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:param name="search-list" as="xs:string*" select="'P', 'T', 'C'"/>

  <xsl:output indent="yes"/>

  <xsl:template match="root">
      <Inventory>
          <xsl:for-each-group select="row[substring(serial, 1, 1) = $search-list]" group-by="substring(serial, 1, 1)">
              <SKU>
                  <xsl:copy-of select="category, product.name"/>
                  <product.count>
                      <xsl:value-of select="count(current-group())"/>
                  </product.count>
                  <xsl:apply-templates select="current-group()/serial"/>
              </SKU>
          </xsl:for-each-group>
      </Inventory>
  </xsl:template>

  <xsl:template match="serial">
      <list>
          <xsl:apply-templates/>
      </list>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / bFDb2Dc

...