pshemek
pshemek

Reputation: 1419

xslt dynamic xpath Saxon EE

I have following xml:

    ...                    
    <peci:Address peci:isDeleted="1">
        <peci:Usage_Type>WORK</peci:Usage_Type>
        <peci:Address_Line_1>AMEC</peci:Address_Line_1>
        <peci:Address_Line_2>2020 Winston Park Drive, Suite
            700</peci:Address_Line_2>
        <peci:City>Oakville</peci:City>
        <peci:Postal_Code>L6H 6X7</peci:Postal_Code>
        <peci:Country>CA</peci:Country>
        <peci:Country_Region>ON</peci:Country_Region>
        <peci:State_Province>Ontario</peci:State_Province>
    </peci:Address>
    <peci:Address peci:isAdded="1">
        <peci:Usage_Type>WORK</peci:Usage_Type>
        <peci:Address_Line_1>639 5th Avenue SW</peci:Address_Line_1>
        <peci:Address_Line_2>Suite 1410</peci:Address_Line_2>
        <peci:City>Calgary</peci:City>
        <peci:Postal_Code>T2P 0M9</peci:Postal_Code>
        <peci:Country>CA</peci:Country>
        <peci:Country_Region>AB</peci:Country_Region>
        <peci:State_Province>Alberta</peci:State_Province>
    <peci:Address>
        <peci:Usage_Type>HOME</peci:Usage_Type>
        <peci:Address_Line_1>88 Bridge Cres.</peci:Address_Line_1>
        <peci:City>Burlington</peci:City>
        <peci:Postal_Code>L7L 0A3</peci:Postal_Code>
        <peci:Country>CA</peci:Country>
        <peci:Country_Region>ON</peci:Country_Region>
        <peci:State_Province>Ontario</peci:State_Province>
   </peci:Address>
   <peci:Email/>
...

I iterate through the document and when find added node

peci:isAdded="1"

I check whether presiding node has the same element and has been deleted

peci:isDeleted="1"

if that is the case I would like to iterate through child elements and list all elements that are different (here everything but country)

I would like to use that for different nodes so I cannot use hard coded list of elements and when iterate through added element I dont know how to access the corresponding element in the proceeding sibling. It try sth like:

<xsl:when
    test="../@peci:isAdded and ../preceding-sibling::*[../local-name()]/@peci:isDeleted">
    <xsl:variable name="oldValueLocations" select="local-name()"/>
    <xsl:value-of select="../preceding-sibling::*[../local-name()][@peci:isDeleted]/$oldValueLocations"/>                    
</xsl:when>

I would expect

 <out:Row xtt:separator="," xtt:quotes="always">
        <out:PayGroupCode>93JH</out:PayGroupCode>
        <out:LegacyID>93JH000660265</out:LegacyID>
        <out:WorkdayID>660265</out:WorkdayID>
        <out:Name>SixWFNLastname SixWFNFirstname</out:Name>
        <out:Status>Active</out:Status>
        <out:Transaction>CHANGE</out:Transaction>
        <out:Process_Type>DTA</out:Process_Type>
        <out:Type>Address</out:Type>
        <out:SubType>Country_Region</out:SubType>
        <out:Effective_Date>2017-03-06</out:Effective_Date>
        <out:Old_Value>ON</out:Old_Value>
        <out:New_Value>AB</out:New_Value>
    </out:Row>

but instead I get

 <out:Row xtt:separator="," xtt:quotes="always">
        <out:PayGroupCode>93JH</out:PayGroupCode>
        <out:LegacyID>93JH000660265</out:LegacyID>
        <out:WorkdayID>660265</out:WorkdayID>
        <out:Name>SixWFNLastname SixWFNFirstname</out:Name>
        <out:Status>Active</out:Status>
        <out:Transaction>CHANGE</out:Transaction>
        <out:Process_Type>DTA</out:Process_Type>
        <out:Type>Address</out:Type>
        <out:SubType>Country_Region</out:SubType>
        <out:Effective_Date>2017-03-06</out:Effective_Date>
        <out:Old_Value>WORK AMEC 2020 Winston Park Drive, Suite 700 Oakville L6H 6X7 CA ON
            Ontario</out:Old_Value>
        <out:New_Value>AB</out:New_Value>
    </out:Row>

Upvotes: 0

Views: 118

Answers (1)

Martin Honnen
Martin Honnen

Reputation: 167696

If you know about local-name() and predicate it seems selecting *[local-name() = $oldValueLocations] seems obvious to select elements of that name, probably with your other path prefixed (although I don't understand what the [../local-name()] is supposed to do).

Upvotes: 0

Related Questions