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.
我正在使用 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.