Xslt 导航到嵌套的子属性并和另一个元素合并

Xslt 导航到嵌套的子属性并和另一个元素合并,xslt,Xslt,在这里,我被XSLT转换所困扰,因为我是一个新手,并且已经开始学习 输入XML <SHOW_LIST> <SHOW ID="12345"> <SHOW_INFO>xxx</SHOW_INFO> <SHOW_ELEMENT_LIST> <SHOW_ELEMENT ID="1"> <SHOW_ELEMENT_LIST> <

在这里,我被XSLT转换所困扰,因为我是一个新手,并且已经开始学习

输入XML

<SHOW_LIST>
<SHOW ID="12345">
    <SHOW_INFO>xxx</SHOW_INFO>
    <SHOW_ELEMENT_LIST>
        <SHOW_ELEMENT ID="1">  
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="12345678"></SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
        </SHOW_ELEMENT>
        <SHOW_ELEMENT ID="2">  
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="12345666"></SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
        </SHOW_ELEMENT>
    </SHOW_ELEMENT_LIST>
    <SECONDARY_ELEMENT_LIST/>
    <ALTERNATIVE_SHOW_LIST>
        <SHOW ID="54321">
            <SHOW_INFO>xxxa</SHOW_INFO>
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
            <SECONDARY_ELEMENT_LIST/>
        </SHOW>
        <SHOW ID="54322">
            <SHOW_INFO>xxxb</SHOW_INFO>
            <SHOW_ELEMENT_LIST>
                <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
                <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
            </SHOW_ELEMENT_LIST>
            <SECONDARY_ELEMENT_LIST/>
        </SHOW>
    </ALTERNATIVE_SHOW_LIST>
</SHOW>

xxx
xxxa
xxxb

输出XML:

<SHOW_LIST>
    <SHOW ID="12345">
        <SHOW_INFO>xxx</SHOW_INFO>
        <SHOW_ELEMENT_LIST>
            <SHOW_ELEMENT ID="1">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
        </SHOW_ELEMENT_LIST>
        <SECONDARY_ELEMENT_LIST/>
        <ALTERNATIVE_SHOW_LIST>
            <SHOW ID="54321">
                <SHOW_INFO>xxxa</SHOW_INFO>
                <SECONDARY_ELEMENT_LIST/>
            </SHOW>
            <SHOW ID="54322">
                <SHOW_INFO>xxxb</SHOW_INFO>
                <SECONDARY_ELEMENT_LIST/>
            </SHOW>
        </ALTERNATIVE_SHOW_LIST>
    </SHOW>
</SHOW_LIST>

xxx
xxxa
xxxb
我能够导航到备用显示列表,无法复制显示元素并与主显示元素列表合并

有人愿意帮我表演这个吗

同一输入文件的另一个输出

<SHOW_LIST>
    <SHOW ID="12345">
        <SHOW_INFO>xxx</SHOW_INFO>
        <SHOW_ELEMENT_LIST>
            <SHOW_ELEMENT ID="1">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="3">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="4">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="5">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="6">  </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="7">  </SHOW_ELEMENT>
        </SHOW_ELEMENT_LIST>
        <SECONDARY_ELEMENT_LIST/>
     </SHOW>
</SHOW_LIST>

xxx
现在我正在尝试这种输出

新的输出XML

<?xml version="1.0" encoding="UTF-8"?>
<SHOW_LIST>
   <SHOW ID="12345">
      <SHOW_INFO>xxx</SHOW_INFO>
      <SHOW_ELEMENT_LIST>
        <SHOW_ELEMENT ID="1">  
                <SHOW_ELEMENT_LIST>
                    <SHOW_ELEMENT ID="12345678"></SHOW_ELEMENT>
                </SHOW_ELEMENT_LIST>
            </SHOW_ELEMENT>
            <SHOW_ELEMENT ID="2">  
                <SHOW_ELEMENT_LIST>
                    <SHOW_ELEMENT ID="12345666"></SHOW_ELEMENT>
                </SHOW_ELEMENT_LIST>
            </SHOW_ELEMENT>
         <SHOW_ELEMENT ID="3"/>
         <SHOW_ELEMENT ID="4"/>
         <SHOW_ELEMENT ID="5"/>
         <SHOW_ELEMENT ID="6"/>
         <SHOW_ELEMENT ID="7"/>
      </SHOW_ELEMENT_LIST>
      <SECONDARY_ELEMENT_LIST/>
    </SHOW>
</SHOW_LIST>

xxx

这个简单的样式表将实现以下功能:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes"/>

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

    <!-- get all the SHOW_ELEMENT nodes -->
    <xsl:template match="SHOW//SHOW_ELEMENT_LIST[not(ancestor::ALTERNATIVE_SHOW_LIST)]">
        <SHOW_ELEMENT_LIST>
            <xsl:copy-of select="..//SHOW_ELEMENT"/>
        </SHOW_ELEMENT_LIST>
    </xsl:template>

    <!-- delete all SHOW_ELEMENT_LIST under ALTERNATIVE_SHOW_LIST -->
    <xsl:template match="SHOW//SHOW_ELEMENT_LIST[ancestor::ALTERNATIVE_SHOW_LIST]"/>

</xsl:stylesheet>


这有助于第二个输出XML删除ATERNATIVE_SCHEDULE_LIST元素。
如果还有其他解决方案,请纠正我

非常感谢Joel。我看到了期望的输出。你能帮助我理解这一点吗?这意味着匹配节点
SHOW
的后代
SHOW\u ELEMENT\u LIST
(它们没有祖先
ALTERNATIVE\u SHOW\u LIST
)。非常感谢你。下一句话还有一个问题。这意味着它与SHOW_ELEMENT_LIST(有一个祖先替代_SHOW_LIST)的后代相匹配。但这是怎么回事,我们只是在匹配列表,什么也没做。这可能是一个愚蠢的问题,但我没有一个想法:-(.我非常有兴趣学习并热衷于XSLT。请解释它的意思是匹配后代
SHOW\u ELEMENT\u LIST
(它有一个祖先
可选的\u SHOW\u LIST
)当模板匹配为空时,它将删除匹配的节点。您好@Joel M.Lamsen,我只是想尝试以下不同的输出。如果您的意思是将
作为第二个模板,那么应该可以正常工作。您好@Joel M.Lamsen,当我尝试另一个相同类型的inputXML时,我无法获得正确的输出ut xml:-(.我修改了输入XML。这里SHOW_元素ID再次包含带有SHOW_元素ID的子列表。在给定的转换中,输出还包含子SHOW_元素ID和main。我试图获得包含主SHOW_元素ID 1,2,3,4,5,6,7的相同输出,但不应包括子SHOW_元素ID,如12345678)和12345666。嗨@Joel M.Lamsen,你能在上面的转换中给出一个简单的逻辑更改吗?请看我的答案这里()。注意,我将xsl:copy of更改为xsl:apply templatesYeah。我明白了。我不仅想“删除可选显示列表下的所有显示元素列表”。我需要完全删除备选方案列表下的元素。这是我以前使用此方法实现的。但现在此方法不起作用
<xsl:template match="ALTERNATIVE_SCHEDULE_LIST"/>