Keep XML fields and one child using XSLT
<p>I am trying to trim an XML document into a new XML document. I have the following XML:</p><pre><br /><code><rpc-reply><br /> <configuration changed-seconds="1450987515" changed-localtime="2015-12-24 20:05:15 UTC"><br /> <routing-instances><br /> <instance><br /> <name>SOMENAME</name><br /> <instance-type>virtual-router</instance-type><br /> <interface><br /> <name>lo0.1</name><br /> </interface><br /> <protocols><br /> <bgp><br /> <group><br /> <name>EBGP-TEST</name><br /> <type>external</type><br /> <neighbor><br /> <name>1.1.1.1</name><br /> <peer-as>7222</peer-as><br /> </neighbor><br /> </group><br /> </bgp><br /> <ospf><br /> <area><br /> <name>0.0.0.0</name><br /> <comment>SOME COMMENT</comment><br /> <interface><br /> <name>all</name><br /> </interface><br /> </area><br /> </ospf><br /> </protocols><br /> </instance><br /> </routing-instances><br /> </configuration><br /> <cli><br /> <banner>[edit]</banner><br /> </cli><br /></rpc-reply><br /></code><br /></pre><p>This is what I need:</p><pre><br /><code><rpc-reply><br /> <configuration changed-seconds="1450987515" changed-localtime="2015-12-24 20:05:15 UTC"><br /> <routing-instances><br /> <instance><br /> <name>SOMENAME</name><br /> <protocols><br /> <ospf><br /> <area><br /> <name>0.0.0.0</name><br /> <comment>SOME COMMENT</comment><br /> <interface><br /> <name>all</name><br /> </interface><br /> </area><br /> </ospf><br /> </protocols><br /> </instance><br /> </routing-instances><br /> </configuration><br /></rpc-reply><br /></code><br /></pre><p>Here is the XSLT code I am using:</p><pre><br /><code><xsl:stylesheet xmlns:xsl="http://ift.tt/tCZ8VR" xmlns:ns="match:ns" version="1.0"><br /> <xsl:output omit-xml-declaration="yes" indent="yes"/><br /> <xsl:strip-space elements="*"/><br /><br /> <ns:WhiteList><br /> <name>area</name><br /> <name>interface</name><br /> <name>instance</name><br /> <name>metric</name><br /> </ns:WhiteList><br /><br /> <xsl:template match="node()|@*"><br /> <xsl:copy><br /> <xsl:apply-templates select="node()|@*"/><br /> </xsl:copy><br /> </xsl:template><br /><br /> <xsl:template match="*[not(descendant-or-self::*[name()=document('')/*/ns:WhiteList/*])]"/><br /><br /> </xsl:stylesheet><br /></code><br /></pre><p>And it almost works:</p><pre><br /><code><rpc-reply><br /> <configuration changed-seconds="1450987515" changed-localtime="2015-12-24 20:05:15 UTC"><br /> <routing-instances><br /> <instance><br /> <interface/><br /> <protocols><br /> <ospf><br /> <area><br /> <interface/><br /> </area><br /> </ospf><br /> </protocols><br /> </instance><br /> </routing-instances><br /> </configuration><br /></rpc-reply><br /></code><br /></pre><p>I just need the child "<code><name></code>" for the interesting elements (if there is one there) and bonus if I can somehow get the "<code><comment></code>" right above "<code><interface></code>" Tried different combinations but not sure how to do it.</p><br /><h2>Click here view more answers <a href="%20http://stackoverflow.com/questions/34469973/keep-xml-fields-and-one-child-using-xslt">http://ift.tt/1QNwIBf</a></h2>
Nhận xét
Đăng nhận xét