XSLT 将一个文件中的多个列表合并到 table

XSLT combine multiple list from one file to table

我需要帮助将一个文件的多个表合并为一个输出。 我根据下面列出的 XSLT 架构完美处理的文件。但是今天我收到了一个有趣的文件,但没有按我的要求进行处理。

源文件

<?xml version="1.0" encoding="utf-8"?>
<extdata user="test">
  <scheme name="Order">
    <data>
      <s>
        <d name="CashOrder">
          <f name="ActionDate" type="Date" />
          <f name="AddressId" type="String" />
          <f name="CompanyId" type="String" />
        </d>
      </s>
      <o>
        <d name="CashOrder">
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>10234</f>
            <f>10234</f>
          </r>
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>52817</f>
            <f>52817</f>
          </r>
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>58259</f>
            <f>58259</f>
          </r>
        </d>
      </o>
    </data>
    <data>
      <s>
        <d name="OrderOption">
          <f name="OrderDate" type="Date" />
          <f name="OrderNumber" type="String" />
        </d>
      </s>
      <o>
        <d name="OrderOption">
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>WE30395.c17639</f>
          </r>
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>WE30395.c17639</f>
          </r>
          <r>
            <f>2022-01-24T00:00:00</f>
            <f>WE30395.c17639</f>
          </r>
        </d>
      </o>
    </data>
  </scheme>
</extdata>

我的 XSLT(这里他们帮助我 writing.there 是层次结构递归处理的问题)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:output method="xml" indent="yes" />
   <xsl:template match="/extdata/scheme">
      <ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         <xsl:for-each select="data/s/d/f | data/s/d/d/f">
            <column>
               <Name xsi:type="xs:string">
                  <xsl:value-of select="@name" />
               </Name>
               <ValueType>
                  <xsl:if test="@type= 'String'">
                     <Type>xs:string</Type>
                     <StringQualifiers>
                        <Length>150</Length>
                        <AllowedLength>Variable</AllowedLength>
                     </StringQualifiers>
                  </xsl:if>
                  <xsl:if test="@type= 'Date'">
                     <Type>xs:dateTime</Type>
                     <DateQualifiers>
                        <DateFractions>DateTime</DateFractions>
                     </DateQualifiers>
                  </xsl:if>
                  <xsl:if test="@type= 'Decimal' or @type= 'Currency'">
                     <Type>xs:decimal</Type>
                     <NumberQualifiers>
                        <Digits>20</Digits>
                        <FractionDigits>4</FractionDigits>
                        <AllowedSign>Any</AllowedSign>
                     </NumberQualifiers>
                  </xsl:if>
                  <xsl:if test="@type= 'Integer'">
                     <Type>xs:decimal</Type>
                     <NumberQualifiers>
                        <Digits>20</Digits>
                        <FractionDigits>0</FractionDigits>
                        <AllowedSign>Any</AllowedSign>
                     </NumberQualifiers>
                  </xsl:if>
               </ValueType>
            </column>
         </xsl:for-each>
         <xsl:for-each select="data/o/d/r">
            <row>
               <xsl:for-each select=".//f">
                  <Value>
                     <xsl:value-of select="." />
                  </Value>
               </xsl:for-each>
            </row>
         </xsl:for-each>
      </ValueTable>
   </xsl:template>
</xsl:stylesheet>

现在输出

      <ValueTable xmlns="http://v8.1c.ru/8.1/data/core"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <column>
      <Name xsi:type="xs:string">ActionDate</Name>
      <ValueType>
         <Type>xs:dateTime</Type>
         <DateQualifiers>
            <DateFractions>DateTime</DateFractions>
         </DateQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">AddressId</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">CompanyId</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">OrderDate</Name>
      <ValueType>
         <Type>xs:dateTime</Type>
         <DateQualifiers>
            <DateFractions>DateTime</DateFractions>
         </DateQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">OrderNumber</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>10234</Value>
      <Value>10234</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>52817</Value>
      <Value>52817</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>58259</Value>
      <Value>58259</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
</ValueTable>

需要

<ValueTable xmlns="http://v8.1c.ru/8.1/data/core"
            xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <column>
      <Name xsi:type="xs:string">ActionDate</Name>
      <ValueType>
         <Type>xs:dateTime</Type>
         <DateQualifiers>
            <DateFractions>DateTime</DateFractions>
         </DateQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">AddressId</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">CompanyId</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">OrderDate</Name>
      <ValueType>
         <Type>xs:dateTime</Type>
         <DateQualifiers>
            <DateFractions>DateTime</DateFractions>
         </DateQualifiers>
      </ValueType>
   </column>
   <column>
      <Name xsi:type="xs:string">OrderNumber</Name>
      <ValueType>
         <Type>xs:string</Type>
         <StringQualifiers>
            <Length>150</Length>
            <AllowedLength>Variable</AllowedLength>
         </StringQualifiers>
      </ValueType>
   </column>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>10234</Value>
      <Value>10234</Value>
      <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>52817</Value>
      <Value>52817</Value>
      <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
   <row>
      <Value>2022-01-24T00:00:00</Value>
      <Value>58259</Value>
      <Value>58259</Value>
     <Value>2022-01-24T00:00:00</Value>
      <Value>WE30395.c17639</Value>
   </row>
 </ValueTable>

简而言之,结构可以描述如下
我的意思是我就是这样得到它的

<table>
  <header>  
    <column1>
    <column2>
    <column3>
    <column4>
    <column5>
  <header>
<row>
   value1
   value2
   value3
</row>
<row>
   value4
   value5
</row>
</table>

但应该是这样的

<table>
  <header> 
   <column1>
   <column2>
   <column3>
   <column4>
   <column5>
  </header>
<row>
   value1
   value2
   value3
   value4
   value5
</row>
</table>

该示例相当令人困惑,因为许多值是相同的,而且很难看出哪些值在何处。也不清楚是否可以有更多 data 个元素,如果可以,那么结果应该是什么。

AFAICT,这会产生给定示例的预期结果。为清楚起见,我省略了 header 部分,它似乎工作正常。

XSLT 1.0

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes" />
   
<xsl:template match="/extdata/scheme">
    <ValueTable xmlns="http://v8.1c.ru/8.1/data/core" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <!-- header -->

        <!-- data -->
        <xsl:for-each select="data[1]/o/d/r">
            <row>
                <xsl:variable name="i" select="position()"/>
                <xsl:for-each select="//data/o/d/r[$i]/f">
                    <Value>
                        <xsl:value-of select="." />
                    </Value>
                </xsl:for-each>
            </row>
        </xsl:for-each>     
    </ValueTable>
</xsl:template>
   
</xsl:stylesheet>