有没有办法在 XSL 操作中设置条件:"AddChange"?

Is there a way to set condition in XSL action: "AddChange"?

有没有办法在 XSL 操作中设置条件:如果条件在其子标记内,则为“AddChange”? 我在 XSL 转换方面还很陌生。 我在这里要做的是,如果状态是“WAPPR”,则操作必须是“添加”,否则将使用“AddChange”。

这是xml:

<?xml version="1.0" encoding="UTF-8"?>
<SyncS1MXWO xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creationDateTime="2021-07-02T09:45:55+08:00" transLanguage="EN" baseLanguage="EN" messageID="2048616251903490366380">
  <S1MXWOSet>
    <WORKORDER action="AddChange">
      <STATUS>WAPPR</STATUS>
    </WORKORDER>
  </S1MXWOSet>
</SyncS1MXWO>

这是我的 XLS:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:max="http://www.ibm.com/maximo"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="http://xml.apache.org/xslt/java" 
version="1.0"
exclude-result-prefixes="xsd xsi max java">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="max:WORKORDER">
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
   <soapenv:Header/>
   <soapenv:Body>
      <max:SyncMXWO>
         <max:MXWOSet>
            <WORKORDER action="AddChange">
               <STATUS><xsl:value-of select="max:STATUS"/></STATUS>
               <xsl:variable name="STATUS" select="max:STATUS"/>
               <xsl:if test="$STATUS = 'WAPPR'">
                  <xsl:attribute name="action">Add</xsl:attribute>
               </xsl:if>
            </WORKORDER>
         </max:MXWOSet>
      </max:SyncMXWO>
   </soapenv:Body>
</soapenv:Envelope>
</xsl:template>
</xsl:stylesheet>

这是我的预期输出:

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <max:SyncMXWO xmlns:max="http://www.ibm.com/maximo">
         <max:MXWOSet>
            <WORKORDER action="Add">
               <STATUS>WAPPR</STATUS>
            </WORKORDER>
         </max:MXWOSet>
      </max:SyncMXWO>
   </soapenv:Body>
</soapenv:Envelope>

这是我收到的错误: 在第 20 行执行 XSLT 时出错:无法在包含元素的子元素之后创建属性节点(操作)。最近的元素开始标记在模块的第 18 行输出

--- 根据澄清进行编辑 ---

您收到一个错误,因为您试图在添加了子项后向元素添加属性;即 not allowed。试试看:

<xsl:template match="max:WORKORDER">
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:max="http://www.ibm.com/maximo">
    <soapenv:Header/>
        <soapenv:Body>
            <max:SyncMXWO>
                <max:MXWOSet>
                    <WORKORDER action="AddChange">
                        <xsl:if test="max:STATUS= 'WAPPR'">
                            <xsl:attribute name="action">Add</xsl:attribute>
                        </xsl:if>
                        <STATUS>
                            <xsl:value-of select="max:STATUS"/>
                        </STATUS>
                    </WORKORDER>
                </max:MXWOSet>
            </max:SyncMXWO>
        </soapenv:Body>
    </soapenv:Envelope>
</xsl:template>

不确定为什么需要 $STATUS 变量,如果您没有始终如一地使用它的话。如上所示完全删除变量或执行以下操作:

                <WORKORDER action="AddChange">
                    <xsl:variable name="STATUS" select="max:STATUS"/>
                    <xsl:if test="$STATUS= 'WAPPR'">
                        <xsl:attribute name="action">Add</xsl:attribute>
                    </xsl:if>
                    <STATUS>
                        <xsl:value-of select="$STATUS"/>
                    </STATUS>
                </WORKORDER>