xsl 模板匹配具有 child 个名称或另一个名称的元素的元素 2 用于删除这些 parent 元素

xsl template match for elements that have child elements of one name or another 2 be used to delete these parent elements

我正在使用 xsl 1.0。 我有这个 xml 如果他们有某些 children 或兄弟姐妹,我需要删除元素:

<?xml version="1.0" encoding="UTF-8"?>
<SyncDMMAXINTOBJECT xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    creationDateTime="2019-09-08T15:53:31-04:00" transLanguage="EN" baseLanguage="EN"
                    messageID="1" maximoVersion="7 6 20181212-1733 V76010">
    <DMMAXINTOBJECTSet>
        <MAXINTOBJECT action="AddChange">
            <ALIASCONFLICT>0</ALIASCONFLICT>
            <MAXINTOBJDETAIL>
                <ALTKEY></ALTKEY>
                <OBJECTNAME>WORKORDER</OBJECTNAME>
                <MAXINTOBJCOLS>
                    <NAME>ACTCONSTCOST</NAME>
                    <OBJECTNAME>WORKORDER</OBJECTNAME>
                </MAXINTOBJCOLS>
                <MAXINTOBJCOLS>
                    <NAME>ACTCONSTCOST2</NAME>
                    <OBJECTNAME>WORKORDER</OBJECTNAME>
                </MAXINTOBJCOLS>
                <MAXINTOBJALIAS>
                    <ALIASNAME>CODEPARK</ALIASNAME>
                    <NAME>CODEPARK</NAME>
                </MAXINTOBJALIAS>
                <MAXINTOBJALIAS>
                    <ALIASNAME>CODEPARK2</ALIASNAME>
                    <NAME>CODEPARK2</NAME>
                </MAXINTOBJALIAS>
            </MAXINTOBJDETAIL>
        </MAXINTOBJECT>
    </DMMAXINTOBJECTSet>
</SyncDMMAXINTOBJECT>

我想设置一个模板来匹配 MAXINTOBJCOLS 类型的所有元素 如果它们具有值为 ACTCONSTCOST 的 child 元素 NAME 和值为 WORKORDER 的 child 元素 OBJECTNAME,或者如果它们具有具有 child 的 parent 元素 MAXINTOBJDETAIL值为 WORKORDER 的元素 OBJECTNAME,以及值为 CODEPARK 的 child 元素 ALIASNAME。

所以如果我 运行 我的模板是空的,它会将上面的 XML 变成这个(2 个元素已被移动):

<?xml version="1.0" encoding="UTF-8"?>
<SyncDMMAXINTOBJECT xmlns="http://www.ibm.com/maximo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    creationDateTime="2019-09-08T15:53:31-04:00" transLanguage="EN" baseLanguage="EN"
                    messageID="1" maximoVersion="7 6 20181212-1733 V76010">
    <DMMAXINTOBJECTSet>
        <MAXINTOBJECT action="AddChange">
            <ALIASCONFLICT>0</ALIASCONFLICT>
            <MAXINTOBJDETAIL>
                <ALTKEY></ALTKEY>
                <OBJECTNAME>WORKORDER</OBJECTNAME>
                <MAXINTOBJCOLS>
                    <NAME>ACTCONSTCOST2</NAME>
                    <OBJECTNAME>WORKORDER</OBJECTNAME>
                </MAXINTOBJCOLS>
                <MAXINTOBJALIAS>
                    <ALIASNAME>CODEPARK2</ALIASNAME>
                    <NAME>CODEPARK2</NAME>
                </MAXINTOBJALIAS>
            </MAXINTOBJDETAIL>
        </MAXINTOBJECT>
    </DMMAXINTOBJECTSet>
</SyncDMMAXINTOBJECT>

我正在使用此 XSL 进行复制,但在给定 parent child 元素关系的情况下,我似乎无法找出匹配项 -

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="max">

    <xsl:output omit-xml-declaration="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Element[@attr1='one' and @attr2='two']"/>
</xsl:stylesheet>

我认为我必须用另外 2 个替换这个才能实现我的目标:

(只做概念验证 - 第二个清除 changeby 属性)

<xsl:template match="Element[@attr1='one' and @attr2='two']"/>

<xsl:template match="max:SyncDMMAXINTOBJECT/max:DMMAXINTOBJECTSet/max:MAXINTOBJECT/max:CHANGEBY/text()"/>

您可以将以下空模板与标识模板结合使用:

<xsl:template match="max:MAXINTOBJCOLS[(max:NAME='ACTCONSTCOST' and max:OBJECTNAME='WORKORDER3') or (../../max:MAXINTOBJDETAIL[max:OBJECTNAME='WORKORDER' and .//max:ALIASNAME='CODEPARK'])]"/>

它匹配两个 max:MAXINTOBJCOLS 元素并删除它们。其余的是复制的。 .//max:ALIASNAME 检查 max:MAXINTOBJDETAIL 是否有一个名为 max:ALIASNAME 的后代。它不仅检查直接 child.