有没有办法在 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>
有没有办法在 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>