Click here to Skip to main content
15,887,346 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have a source XML and that looks like

<?xml version="1.0" encoding="UTF-8" ?>
<HOST_LIST_VM_DETECTION_OUTPUT>
  <RESPONSE>
    <DATETIME>2017-05-05T08:52:51Z</DATETIME>
    <HOST_LIST>
    <HOST>
        <IP>10.132.195.26</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>38255</QID>
          </DETECTION>
          <DETECTION>
            <QID>70001</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
	<HOST>
        <IP>172.18.4.79</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>19626</QID>
          </DETECTION>
          <DETECTION>
            <QID>19627</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
		      </HOST_LIST>
  </RESPONSE>
</HOST_LIST_VM_DETECTION_OUTPUT>


I want a resultant out put like this

<Records>
<record>
<qid>38255</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>70001</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>19626</qid>
<ip>172.18.4.79</ip>
</record>
<record>
<qid>19627</qid>
<ip>172.18.4.79</ip>
</record>
</Records>


What I have tried:

The XSLT that I have been trying to customize looks like this

<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version = "1.0" 
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">   
   
<xsl:template match="/">
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
</xsl:template>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST">
<xsl:value-of select="IP"/>
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION"/>
</xsl:temaplte>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:for-each select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:value-of select="QID"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


But i am not able to get inside <detection_list>
Posted
Updated 8-May-17 12:42pm
v2

The select query passed to apply-templates and for-each is relative to the current node.

You are already in HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST, so your apply-templates query is looking for:
HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION

and your for-each template is looking for:
HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION


You also need to include the elements that you want in your output.

Change your template to:
XML
<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
    <xsl:template match="/">
        <Records>
            <xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
        </Records>
    </xsl:template>
    
    <xsl:template match="HOST">
        <xsl:variable name="IP" select="IP" />
        <xsl:for-each select="DETECTION_LIST/DETECTION">
            <record>
                <qid><xsl:value-of select="QID"/></qid>
                <ip><xsl:value-of select="$IP"/></ip>
            </record>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>
 
Share this answer
 
Comments
Maciej Los 8-May-17 14:40pm    
5ed!
try to replace
HTML
</xsl:temaplte>

with
HTML
</xsl:template>
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900