Reputation: 19
I need your help on fixing my xslt.
My requirement is to remove specific child node based on its decedents(grandchild) value.
in the below example, i need to write an xslt which gives me xml containing whose decedent "SID" value not equal to "1113181"
<CDM CDMVersion="1.3" FType="Transactional" FOID="85b40b86-e6f1-4813-a5f4-0b98c90bd72d" CreationDateTime="2016-08-19T19:04:25" xmlns="http://www.example.com/ns/CDM/v1.3" xmlns:xyz="http://www.example.com/ns/CDM/MData">
<TestData EduOID="LX4211-204" MDataVersionOID="34" xyz:AuditSubCategoryName="Verify">
<SubData SubKey="5117f771-790f-4cde-b261-1a2db0dcd04b" xyz:SubKeyType="SubUUID" xyz:SubName="204-0114-002">
<SRef LocOID="LX4211204_0114"/>
<SubEventData EduEventOID="EOT" EduEventRepeatKey="EOT[1]" xyz:InstanceId="76194">
<FmData FmOID="VS2" FmRepeatKey="1" xyz:DataPageId="388465">
<IGroupData IGroupOID="VS2" xyz:RecordId="1044557">
<IData ItemOID="VS2.VSORRES4_2" TransactionType="Upsert" xyz:Verify="Yes">
<Record>
<TesterRef TesterOID="bballardamad1"/>
<LocRef LocOID="LX4211204_0114"/>
<DateTimeStamp>2016-08-16T17:07:15</DateTimeStamp>
<ReasonForChange/>
<SID>1113181</SID>
</Record>
</IData>
</IGroupData>
</FmData>
</SubEventData>
</SubData>
</TestData>
<TestData EduOID="LX4211-204" MDataVersionOID="34" xyz:AuditSubCategoryName="QueryClose">
<SubData SubKey="5117f771-790f-4cde-b261-1a2db0dcd04b" xyz:SubKeyType="SubUUID" xyz:SubName="204-0114-002">
<SRef LocOID="LX4211204_0114"/>
<SubEventData EduEventOID="EOT" EduEventRepeatKey="EOT[1]" xyz:InstanceId="76194">
<FmData FmOID="VS2" FmRepeatKey="1" xyz:DataPageId="388465">
<IGroupData IGroupOID="VS2" xyz:RecordId="1044557">
<IData ItemOID="VS2.VSORRES4_2" TransactionType="Upsert">
<Record>
<TesterRef TesterOID="bballardamad1"/>
<LocRef LocOID="LX4211204_0114"/>
<DateTimeStamp>2016-08-16T17:07:15</DateTimeStamp>
<ReasonForChange/>
<SID>1113182</SID>
</Record>
<xyz:Query QueryRepeatKey="552326" Status="Closed" Recipient="Site from CRA"/>
</IData>
</IGroupData>
</FmData>
</SubEventData>
</SubData>
</TestData>
<TestData EduOID="LX4211-204" MDataVersionOID="34" xyz:AuditSubCategoryName="Verify">
<SubData SubKey="5117f771-790f-4cde-b261-1a2db0dcd04b" xyz:SubKeyType="SubUUID" xyz:SubName="204-0114-002">
<SRef LocOID="LX4211204_0114"/>
<SubEventData EduEventOID="WK1_POST" EduEventRepeatKey="WK1_POST[1]" xyz:InstanceId="119171">
<FmData FmOID="VS2" FmRepeatKey="1" xyz:DataPageId="670872">
<IGroupData IGroupOID="VS2" xyz:RecordId="1934354">
<IData ItemOID="VS2.VSORRES12" TransactionType="Upsert" xyz:Verify="Yes">
<Record>
<TesterRef TesterOID="bballardamad1"/>
<LocRef LocOID="LX4211204_0114"/>
<DateTimeStamp>2016-08-16T17:09:10</DateTimeStamp>
<ReasonForChange/>
<SID>1114610</SID>
</Record>
</IData>
</IGroupData>
</FmData>
</SubEventData>
</SubData>
</TestData>
</CDM>
================================================================================
My XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!--<xsl:template match="//SID[text()!=1113181]"/>-->
<xsl:template match="/CDM/TestData/SubData/SubEventData/FmData/IGroupData/IData/Record/SID[text()!=68943181]"/>
</xsl:stylesheet>
Expected Output:
#<CDM CDMVersion="1.3" FType="Transactional" FOID="85b40b86-e6f1-4813-a5f4-0b98c90bd72d" CreationDateTime="2016-08-19T19:04:25" xmlns="http://www.example.com/ns/CDM/v1.3" xmlns:xyz="http://www.example.com/ns/CDM/MData">
<TestData EduOID="LX4211-204" MDataVersionOID="34" xyz:AuditSubCategoryName="QueryClose">
<SubData SubKey="5117f771-790f-4cde-b261-1a2db0dcd04b" xyz:SubKeyType="SubUUID" xyz:SubName="204-0114-002">
<SRef LocOID="LX4211204_0114"/>
<SubEventData EduEventOID="EOT" EduEventRepeatKey="EOT[1]" xyz:InstanceId="76194">
<FmData FmOID="VS2" FmRepeatKey="1" xyz:DataPageId="388465">
<IGroupData IGroupOID="VS2" xyz:RecordId="1044557">
<IData ItemOID="VS2.VSORRES4_2" TransactionType="Upsert">
<Record>
<TesterRef TesterOID="bballardamad1"/>
<LocRef LocOID="LX4211204_0114"/>
<DateTimeStamp>2016-08-16T17:07:15</DateTimeStamp>
<ReasonForChange/>
<SID>1113182</SID>
</Record>
<xyz:Query QueryRepeatKey="552326" Status="Closed" Recipient="Site from CRA"/>
</IData>
</IGroupData>
</FmData>
</SubEventData>
</SubData>
</TestData>
<TestData EduOID="LX4211-204" MDataVersionOID="34" xyz:AuditSubCategoryName="Verify">
<SubData SubKey="5117f771-790f-4cde-b261-1a2db0dcd04b" xyz:SubKeyType="SubUUID" xyz:SubName="204-0114-002">
<SRef LocOID="LX4211204_0114"/>
<SubEventData EduEventOID="WK1_POST" EduEventRepeatKey="WK1_POST[1]" xyz:InstanceId="119171">
<FmData FmOID="VS2" FmRepeatKey="1" xyz:DataPageId="670872">
<IGroupData IGroupOID="VS2" xyz:RecordId="1934354">
<IData ItemOID="VS2.VSORRES12" TransactionType="Upsert" xyz:Verify="Yes">
<Record>
<TesterRef TesterOID="bballardamad1"/>
<LocRef LocOID="LX4211204_0114"/>
<DateTimeStamp>2016-08-16T17:09:10</DateTimeStamp>
<ReasonForChange/>
<SID>1114610</SID>
</Record>
</IData>
</IGroupData>
</FmData>
</SubEventData>
</SubData>
</TestData>
</CDM>
#
Upvotes: 1
Views: 1820
Reputation: 117140
There are four reasons why your attempt doesn't work:
TestData
, make it match TestData
- not its descendant;<TestData>
whose descendant SID
value does not equal 1113181
, then make your removing template match TestData
whose descendant SID
value does equal 1113181
;68943181
is not 1113181
.Try:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cdm="http://www.example.com/ns/CDM/v1.3">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="cdm:TestData[cdm:SubData/cdm:SubEventData/cdm:FmData/cdm:IGroupData/cdm:IData/cdm:Record/cdm:SID=1113181]"/>
</xsl:stylesheet>
Upvotes: 2