Is there a xpath to get these values only

34 Views Asked by At

Can any one help me to get right Xpath for appropriate transformation through xslt??

As I am attempting to transform the input.xml using xslt through xpath (document(input.xml)//track) to get the desire output as noted below.

input xml: as noted below

    <mergingTracksBreakdownStructure>
    <track id="10">
      <mergedTrack id="10"/>
      <mergedTrack id="11"/>
      <mergedTrack id="12"/>
       <track id="13">
         <mergedTrack id="13"/>
         <mergedTrack id="14"/>
           <track id="15">
              <mergedTrack id="15"/>
               <mergedTrack id="16"/>
            </track>
        </track>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
    <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

ouput xml needed: as noted below


    <mergingTracksBreakdownStructure>
     <track id="10">
       <mergedTrack id="10"/>
       <mergedTrack id="11"/>
       <mergedTrack id="12"/>
    </track>
    <track id="13">
      <mergedTrack id="13"/>
      <mergedTrack id="14"/>
    </track>
    <track id="15">
      <mergedTrack id="15"/>
      <mergedTrack id="16"/>
    </track>
    <track id="27">
      <mergedTrack id="27"/>
    </track>
    <track id="30">
      <mergedTrack id="30"/>
    </track>
    </mergingTracksBreakdownStructure>

XSLT used for transormation:

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

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

    <xsl:template match="/">
        <xsl:result-document href="output.xml" method="xml">
        <xsl:apply-templates select="document('input.xml')//track"/>
        </xsl:result-document>
    </xsl:template>

</xsl:stylesheet>
1

There are 1 best solutions below

0
michael.hor257k On

The requested output can be achieved quite easily by applying the following stylesheet to the input XML:

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

<xsl:template match="/mergingTracksBreakdownStructure">
    <xsl:copy>
        <xsl:apply-templates select="track"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="track">
    <xsl:copy>
        <xsl:copy-of select="@* | mergedTrack"/>
    </xsl:copy>
    <xsl:apply-templates select="track"/>
</xsl:template>

</xsl:stylesheet>