【问题标题】:XSLT grouping into header & positionsXSLT 分组到标题和位置
【发布时间】:2022-08-20 03:42:01
【问题描述】:

我有以下可用的 xml 导出:

<?xml version=\'1.0\' encoding=\'UTF-8\'?>
<document>
    <header>
        <creation-date>2022-08-09T08:46:00</creation-date>
        <SequenceOfDocument>10</SequenceOfDocument>
    </header>
    <businessobjects>
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>606.00</OrderNumber>
            <Person>
                <UsrAddress>
                    <Code>0393</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>30.00</TotalActualCostExclVAT>
            <ParentOrderRef/>
        </Reservation>
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>606.01</OrderNumber>
            <RefBODefinitionUserDefined>UsrReservationEquipment</RefBODefinitionUserDefined>
            <Person>
                <UsrAddress>
                    <Code>0393</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>40.00</TotalActualCostExclVAT>
            <ParentOrderRef>606.00</ParentOrderRef>
        </Reservation>
        
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>607.00</OrderNumber>
            <RefBODefinitionUserDefined>UsrReservationEquipment</RefBODefinitionUserDefined>
            <Person>
                <UsrAddress>
                    <Code>0500</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>50.00</TotalActualCostExclVAT>
            <ParentOrderRef></ParentOrderRef>
        </Reservation>
    </businessobjects>
</document>

我想通过 XSLT 浏览所有内容,按:/Person/Us Address/Code 分组

结果应该是:

<SalesOrderHeader>
    <SalesOrderHeaderFields>
        <CustomerNumber>0393</CustomerNumber>
    </SalesOrderHeaderFields>
    <ItemFields>
        <_USERFIELD1>606.00</_USERFIELD1>
    </ItemFields>
    <ItemFields>
        <_USERFIELD1>606.01</_USERFIELD1>
    </ItemFields>
</SalesOrderHeader>

<SalesOrderHeader>
    <SalesOrderHeaderFields>
        <CustomerNumber>0500</CustomerNumber>
    </SalesOrderHeaderFields>
    <ItemFields>
        <_USERFIELD1>607.00</_USERFIELD1>
    </ItemFields>
</SalesOrderHeader>

我已经试过了:

<xsl:for-each-group select=\"Reservation\" group-by=\"/Person/UsrAddress/Code\">

                      <xsl:for-each select=\"current-group()\">

但我没有将它们按 Person/UsrAddress/Code 分组。我不会像示例中那样将它们分组。也许有人可以给我一个提示?

  • 您的路径已关闭,从stackoverflow.com/tags/xslt-grouping/info 之类的示例/介绍开始,然后根据您的需要调整分组示例,确保在必要时使用相对路径。如果您继续遇到问题,请发布一个最小但复杂的 XSLT 以及您得到的错误或错误输出。
  • 而不是&lt;xsl:for-each-group select=\"Reservation\" group-by=\"/Person/UsrAddress/Code\"&gt; 尝试&lt;xsl:for-each-group select=\"Reservation\" group-by=\"Person/UsrAddress/Code\"&gt;

标签: xml xslt xslt-2.0


【解决方案1】:

使用 XSLT 1.0,下面的映射器将为您提供所需的结果。我已经在 XSLT 中评论了它背后的逻辑。

输入:

<?xml version='1.0' encoding='UTF-8'?>
<document>
    <header>
        <creation-date>2022-08-09T08:46:00</creation-date>
        <SequenceOfDocument>10</SequenceOfDocument>
    </header>
    <businessobjects>
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>606.00</OrderNumber>
            <Person>
                <UsrAddress>
                    <Code>0393</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>30.00</TotalActualCostExclVAT>
            <ParentOrderRef/>
        </Reservation>
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>606.01</OrderNumber>
            <RefBODefinitionUserDefined>UsrReservationEquipment</RefBODefinitionUserDefined>
            <Person>
                <UsrAddress>
                    <Code>0393</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>40.00</TotalActualCostExclVAT>
            <ParentOrderRef>606.00</ParentOrderRef>
        </Reservation>
        <Reservation>
            <BeginDateTime>2022-07-29T16:00:00</BeginDateTime>
            <OrderNumber>607.00</OrderNumber>
            <RefBODefinitionUserDefined>UsrReservationEquipment</RefBODefinitionUserDefined>
            <Person>
                <UsrAddress>
                    <Code>0500</Code>
                </UsrAddress>
            </Person>
            <TotalActualCostExclVAT>50.00</TotalActualCostExclVAT>
            <ParentOrderRef></ParentOrderRef>
        </Reservation>
    </businessobjects>
</document>

XSLT 映射器:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <!-- Copy All Elements  -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
    <!-- Create Normalized Spaces  -->
    <xsl:template match="text()">
        <xsl:value-of select="normalize-space()"/>
    </xsl:template>
    <!-- Begin Mapping -->
    <xsl:template match="//document">
        <!-- Get Unqiue Code Values -->
        <xsl:for-each select=".//Person/UsrAddress/Code[not(.=preceding::*)]">
            <!-- Create a Variable using the Unique Values -->
            <xsl:variable name="docKey" select="text()"/>
            <xsl:element name="SalesOrderHeader">
                <!-- Map the Unique Values to the Customer Number Field from the for-each loop -->
                <xsl:element name="SalesOrderHeaderFields">
                    <xsl:element name="CustomerNumber">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:element>
                <!-- Loop through the XML again to get each non-unique Code Value -->
                <xsl:for-each select="//Person/UsrAddress/Code">
                    <xsl:choose>
                        <!-- When the loop constains the above docKey variable, output the _USERFIELD1 element grouped inside of the first for-each loop -->
                        <xsl:when test="contains($docKey, .)">
                            <xsl:element name="ItemFields">
                                <xsl:element name="_USERFIELD1">
                                    <!-- Go up two levels from the current Code element to get the Order Number value -->
                                    <xsl:value-of select="../../../OrderNumber"/>
                                </xsl:element>
                            </xsl:element>
                        </xsl:when>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:element>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

期望的输出:

<?xml version="1.0" encoding="UTF-8"?>
<SalesOrderHeader>
    <SalesOrderHeaderFields>
        <CustomerNumber>0393</CustomerNumber>
    </SalesOrderHeaderFields>
    <ItemFields>
        <_USERFIELD1>606.00</_USERFIELD1>
    </ItemFields>
    <ItemFields>
        <_USERFIELD1>606.01</_USERFIELD1>
    </ItemFields>
</SalesOrderHeader>
<SalesOrderHeader>
    <SalesOrderHeaderFields>
        <CustomerNumber>0500</CustomerNumber>
    </SalesOrderHeaderFields>
    <ItemFields>
        <_USERFIELD1>607.00</_USERFIELD1>
    </ItemFields>
</SalesOrderHeader>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2011-11-18
    • 2011-03-31
    • 2011-09-21
    相关资源
    最近更新 更多