当前位置: 首页 > 知识库问答 >
问题:

使用基于IF条件的XSLT合并XML

微生旻
2023-03-14
<?xml version='1.0' encoding='UTF-8'?>
<multimap:Messages xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
    <multimap:Message1>
        <n0:ZHTR_LEAVE_SAL_ADVANCEResponse xmlns:n0="urn:sap-com:document:sap:rfc:functions" xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
            <E_LEAVEDATA>
                <item>
                    <PERNR>100087</PERNR>
                    <AMOUNT>0.0</AMOUNT>
                    <DAYS/>
                    <DATE>0000-00-00</DATE>
                    <NOFDAYS>0</NOFDAYS>
                    <HOLIDAYS/>
                </item>
                <item>
                    <PERNR>100103</PERNR>
                    <AMOUNT>0.0</AMOUNT>
                    <DAYS/>
                    <DATE>0000-00-00</DATE>
                    <NOFDAYS>0</NOFDAYS>
                    <HOLIDAYS/>
                </item>
                <item>
                    <PERNR>100104</PERNR>
                    <AMOUNT>0.0</AMOUNT>
                    <DAYS/>
                    <DATE>0000-00-00</DATE>
                    <NOFDAYS>0</NOFDAYS>
                    <HOLIDAYS/>
                </item>
                <item>
                    <PERNR>100120</PERNR>
                    <AMOUNT>0.0</AMOUNT>
                    <DAYS/>
                    <DATE>0000-00-00</DATE>
                    <NOFDAYS>0</NOFDAYS>
                    <HOLIDAYS/>
                </item>
            </E_LEAVEDATA>
        </n0:ZHTR_LEAVE_SAL_ADVANCEResponse>
    </multimap:Message1>
    <multimap:Message2>
        <EmployeeTime>
            <EmployeeTime>
                <approvalStatus>CANCELLED</approvalStatus>
                <lastModifiedDateTime>2020-04-27T05:34:15.000</lastModifiedDateTime>
                <externalCode>6e986c5615e3461eacaa13ab4a621e6d</externalCode>
                <cust_SickLeaveReason/>
                <deductionQuantity>1</deductionQuantity>
                <endDate>2020-04-27T00:00:00.000</endDate>
                <timeTypeNav>
                    <TimeType>
                        <country>SGP</country>
                        <externalCode>2020</externalCode>
                        <externalName_defaultValue>Marriage Leaves for Tradings</externalName_defaultValue>
                    </TimeType>
                </timeTypeNav>
                <displayQuantity>1</displayQuantity>
                <lastModifiedBy>SemantiB</lastModifiedBy>
                <quantityInDays>1</quantityInDays>
                <createdDateTime>2020-04-27T05:33:17.000</createdDateTime>
                <timeType>2020</timeType>
                <workflowRequestId/>
                <userId>100087</userId>
                <createdBy>SemantiB</createdBy>
                <startDate>2020-04-27T00:00:00.000</startDate>
                <originalQuantityInDays>1</originalQuantityInDays>
            </EmployeeTime>
            <EmployeeTime>
                <approvalStatus>CANCELLED</approvalStatus>
                <lastModifiedDateTime>2020-05-09T09:06:16.000</lastModifiedDateTime>
                <externalCode>4749af0fb5d04a8f91d42d86a842cc48</externalCode>
                <cust_SickLeaveReason/>
                <deductionQuantity>105</deductionQuantity>
                <endDate>2020-12-02T00:00:00.000</endDate>
                <timeTypeNav>
                    <TimeType>
                        <country>SGP</country>
                        <externalCode>2002</externalCode>
                        <externalName_defaultValue>Maternity Leave continuous</externalName_defaultValue>
                    </TimeType>
                </timeTypeNav>
                <displayQuantity>105</displayQuantity>
                <lastModifiedBy>SemantiB</lastModifiedBy>
                <quantityInDays>75</quantityInDays>
                <createdDateTime>2020-05-08T10:12:26.000</createdDateTime>
                <timeType>2002</timeType>
                <workflowRequestId/>
                <userId>100103</userId>
                <createdBy>SemantiB</createdBy>
                <startDate>2020-08-20T00:00:00.000</startDate>
                <originalQuantityInDays>75</originalQuantityInDays>
            </EmployeeTime>
            <EmployeeTime>
                <approvalStatus>CANCELLED</approvalStatus>
                <lastModifiedDateTime>2020-05-12T04:22:36.000</lastModifiedDateTime>
                <externalCode>b7457bf1049846d390843e51286d01d1</externalCode>
                <cust_SickLeaveReason/>
                <deductionQuantity>40</deductionQuantity>
                <endDate>2020-10-06T00:00:00.000</endDate>
                <timeTypeNav>
                    <TimeType>
                        <country>SGP</country>
                        <externalCode>2003</externalCode>
                        <externalName_defaultValue>Maternity Leave non-continuous</externalName_defaultValue>
                    </TimeType>
                </timeTypeNav>
                <displayQuantity>40</displayQuantity>
                <lastModifiedBy>SemantiB</lastModifiedBy>
                <quantityInDays>40</quantityInDays>
                <createdDateTime>2020-05-09T12:27:36.000</createdDateTime>
                <timeType>2003</timeType>
                <workflowRequestId/>
                <userId>100104</userId>
                <createdBy>SemantiB</createdBy>
                <startDate>2020-08-12T00:00:00.000</startDate>
                <originalQuantityInDays>40</originalQuantityInDays>
            </EmployeeTime>
            <EmployeeTime>
                <approvalStatus>APPROVED</approvalStatus>
                <lastModifiedDateTime>2020-05-12T05:14:03.000</lastModifiedDateTime>
                <externalCode>06e20a72d55b4da191e3b96438229f12</externalCode>
                <cust_SickLeaveReason>8</cust_SickLeaveReason>
                <deductionQuantity>28</deductionQuantity>
                <endDate>2020-06-18T00:00:00.000</endDate>
                <timeTypeNav>
                    <TimeType>
                        <country>SGP</country>
                        <externalCode>2007</externalCode>
                        <externalName_defaultValue>Sick Leave</externalName_defaultValue>
                    </TimeType>
                </timeTypeNav>
                <displayQuantity>28</displayQuantity>
                <lastModifiedBy>SemantiB</lastModifiedBy>
                <quantityInDays>28</quantityInDays>
                <createdDateTime>2020-05-12T05:14:03.000</createdDateTime>
                <timeType>2007</timeType>
                <workflowRequestId/>
                <userId>100120</userId>
                <createdBy>SemantiB</createdBy>
                <startDate>2020-05-12T00:00:00.000</startDate>
                <originalQuantityInDays>28</originalQuantityInDays>
            </EmployeeTime>
        </EmployeeTime>
    </multimap:Message2>
</multimap:Messages>
<EmployeeTime>
    <EmployeeTime>
        <approvalStatus>CANCELLED</approvalStatus>
        <userId>100087</userId>
        <PERNR>100087</PERNR>
        <AMOUNT>0.0</AMOUNT>
    </EmployeeTime>
    <EmployeeTime>
        <approvalStatus>CANCELLED</approvalStatus>
        <userId>100103</userId>
        <PERNR>100103</PERNR>
        <AMOUNT>0.0</AMOUNT>
    </EmployeeTime>
    <EmployeeTime>
        <approvalStatus>CANCELLED</approvalStatus>
        <userId>100104</userId>
        <PERNR>100104</PERNR>
        <AMOUNT>0.0</AMOUNT>
    </EmployeeTime>
</EmployeeTime>

我正在使用下面的XSLT-

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
        <EmployeeTime>
            <xsl:for-each select="Messages/Message2">
                <EmployeeTime>
                    <approvalStatus>
                        <xsl:value-of select="EmployeeTime/EmployeeTime/approvalStatus"/>
                    </approvalStatus>
                    <userId>
                        <xsl:value-of select="EmployeeTime/EmployeeTime/userId"/>
                    </userId>
                    <xsl:if test="userId=Messages/Messages1/ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/PERNR">
                    <PERNR>
                    <xsl:value-of select="Messages/Messages1/ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/PERNR"/>
                    </PERNR>
                    <AMOUNT>
                    <xsl:value-of select="Messages/Messages1/ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/AMOUNT"/>
                    </AMOUNT>
                </EmployeeTime>
            </xsl:for-each>     
        </EmployeeTime>
    </xsl:template>
</xsl:stylesheet>

可以有人请检查XSLT代码,帮助我得到想要的结果。当前,我得到以下错误数组([type]=>2[message]=>XSLTProcessor::TransformToxML():没有与此对象关联的样式表[file]=>/var/www/html/online-toolz.com/functions/xslt.php[line]=>26)错误:XSLTProcessor::TransformToxML():没有与此对象关联的样式表

共有1个答案

郑俊彦
2023-03-14

您的xsl:if没有关闭。您还需要理清如何处理名称空间。

这应该让你开始:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:multimap="http://sap.com/xi/XI/SplitAndMerge">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>

    <xsl:template match="/">
        <xsl:variable name="messages1"><xsl:copy-of select="multimap:Messages/multimap:Messages1" /></xsl:variable>
        <EmployeeTime>
            <xsl:for-each select="multimap:Messages/multimap:Message2">
                <EmployeeTime>
                    <approvalStatus>
                        <xsl:value-of select="EmployeeTime/EmployeeTime/approvalStatus"/>
                    </approvalStatus>
                    <userId>
                        <xsl:value-of select="EmployeeTime/EmployeeTime/userId"/>-
                        <xsl:value-of select="count(msxsl:node-set($messages1)//*)"/>]
                    </userId>
                    <xsl:if test="userId=msxsl:node-set($messages1)/n0:ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/PERNR">
                        <PERNR>
                        <xsl:value-of select="msxsl:node-set($messages1)/n0:ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/PERNR"/>
                        </PERNR>
                        <AMOUNT>
                        <xsl:value-of select="msxsl:node-set($messages1)/n0:ZHTR_LEAVE_SAL_ADVANCEResponse/E_LEAVEDATA/item/AMOUNT"/>
                        </AMOUNT>
                    </xsl:if>
                </EmployeeTime>
            </xsl:for-each>     
        </EmployeeTime>
    </xsl:template>

</xsl:stylesheet>

如果要引用for-each中的节点,也就是在select上下文之外的节点,则需要在for-each之外定义一个变量,然后在内部引用它。上面已经被编辑以显示这一点,但没有测试。如何使用节点集取决于使用的转换器。我已经为MSXML指定了as。

<xsl:for-each select="multimap:Messages/multimap:Message2/EmployeeTime">
 类似资料:
  • 我试图通过选择符合以下条件的歌曲节点来转换上述XML: 状态='已发布' 如果匹配Data/Record/@Id的 /AUTH/AUTHOR_ID的AUTH/HIDE值为true,则不显示ART/TYPE(在这种情况下,Id=1826155) 所需的XML输出应包括Type、所有作者和标题。第二个歌曲类型在此示例中隐藏(因为HIDE=true对于主要作者): 我开始尝试每种方法,但发现我无法显示与

  • 我有两个xml文件,需要使用XSLT将它们合并为一个。 第一个XML是(原始的): 第二个XML(更新数据)如下所示: 所需的合并结果-使用第二个XML更新第一个: 我已经搜索了stackoverflow,但仍然找不到答案。谢谢你的帮助。

  • 我有一个xslt文档。我想在这个文档中使用if语句。我的代码是: 如果返回的值是code1然后写A,如果返回的值是code2然后写B。 我该怎么做?

  • 我有一个excel,其中第1行中有从第1列到第15列的值。最后的每个单元格值都有一个数字。 我想创建另一行,该行根据结束编号合并单元格,并将相应的文本放入合并的单元格中。但是行值仍然需要保持顺序。 例如,,4等等。现在我想在第2行中为ABC3创建前3个单元格的合并,并放置。我需要在同一行2中创建5个合并的单元格来放置。之后,将4个单元格合并到同一行并放置等等。有什么想法如何实现这一点?

  • 我有一个有许多记录的表。它有以下结构: 表(col1、col2、col3、col4、col5、col6): 还有很多很多其他的行。 因此,我想要一张桌子: 表(col1,col2,col3,col4_1,col4_2,col4_3,col5_1,col5_2,col5_3,col6_1,col6_2,col6_3): 换句话说:表中的某些部分具有相同的,但不同的。每个相同的行数在1-3之间变化(事

  • 我想合并基于多个条件的2个数据帧。 DF1是主表,DF2被视为查找表 如果DF1的col1和col2与DF2的col1和col2匹配,且DF1的“值”介于DF2的最小值和最大值之间,则DF2的“数据”列将添加到DF1中。如果不满足条件,DF1的“数据”值为NA。 预期输出(前6行): 我尝试使用合并(匹配col1和col2)和子集(只过滤值介于最小和最大之间的行),但我的目标是维护DF1的所有行。