XSLT-преобразование для разделения файла на повторяющиеся элементы - PullRequest
0 голосов
/ 29 мая 2020

У меня есть файл xml в следующем формате:

<?xml version="1.0" encoding="UTF-8"?>
<Feed xmlns="http://www.somecompany.com/xs/PRR/SomeFeed/14.7" encryptionKeyID="ENCRYPTION-KEY-ID-2020-05-01T18:00:17.324Z">
   <Interaction>
      <EncryptedEmailAddress></EncryptedEmailAddress>
      <UserID></UserID>
      <UserName></UserName>
      <TransactionDate></TransactionDate>
      <Locale></Locale>
      <DeploymentZone></DeploymentZone>
      <Products>
         <Product>
            <ExternalId></ExternalId>
            <Name></Name>
            <Price></Price>
            <ImageUrl></ImageUrl>
         </Product>
         <Product>
            <ExternalId></ExternalId>
            <Name></Name>
            <Price></Price>
            <ImageUrl></ImageUrl>
         </Product>
      </Products>
   </Interaction>
   <Interaction>
      <EncryptedEmailAddress></EncryptedEmailAddress>
      <UserID></UserID>
      <UserName></UserName>
      <TransactionDate></TransactionDate>
      <Locale></Locale>
      <DeploymentZone></DeploymentZone>
      <Products>
         <Product>
            <ExternalId></ExternalId>
            <Name></Name>
            <Price>37</Price>
            <ImageUrl></ImageUrl>
         </Product>
      </Products>
   </Interaction>
</Feed>

Этот канал может иметь миллионы взаимодействий. Я хочу создать преобразование xsl для разделения файлов с использованием 9000 взаимодействий за раз. Мне нужен элемент Feed в каждом разделенном файле.

Я пробовал следующее, но он работает некорректно.

<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/*">
    <xsl:for-each-group select="*" group-adjacent="(position()-1) idiv 9000">
      <xsl:result-document href="chunk{position()}.xml">
        <xsl:copy>
          <xsl:copy-of select="."/>
        </xsl:copy>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>
</xsl:transform>

Это неправильно группируется и не включает элемент ленты в каждом файле.

1 Ответ

0 голосов
/ 29 мая 2020

Используйте

<xsl:copy select="/*">
  <xsl:copy-of select="current-group()"/>
</xsl:copy>

Если вы хотите использовать Saxon EE и потоковую передачу, я думаю, что xsl:copy select="/*" не будет работать, но вы можете использовать <xsl:element name="{name(..)}" namespace="{namespace-uri(..)}"> вместо

<xsl:template match="/*">
    <xsl:for-each-group select="*" group-adjacent="(position() - 1) idiv $chunk-size">
        <xsl:result-document href="split-{position()}.xml">
            <xsl:element name="{name(..)}" namespace="{namespace-uri(..)}">
                <xsl:copy-of select="current-group()"/>
            </xsl:element>
        </xsl:result-document>
    </xsl:for-each-group>
</xsl:template>
...