2016-08-27 4 views
1

Мне нужна ваша помощь по исправлению моего xslt.xslt: удаление узла на основе его дочернего элемента value

Мое требование состоит в том, чтобы удалить определенный дочерний узел на основании значения его дециентов (внука).

в примере ниже, я должен написать XSLT, который дает мне XML, содержащий которого умерший "SID" значение, не равное "1113181"

Входной XML:

<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> 

=== ================================================== ===========================

Мой 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> 

Ожидаемый результат:

#
<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> 
#

ответ

2

Есть четыре причины, почему ваша попытка не работает:

  1. Если вы хотите шаблон, чтобы удалить TestData , сделать его совпадением TestData - не его потомком;
  2. Элементы вашего входного XML находятся в пространстве имен ; вам нужно объявить префикс и использовать его при сопоставлении/выборе;
  3. Если вы хотите сохранить <TestData> чьего потомок SID значения не равен 1113181, затем сделайте свой удалением матча шаблона TestData чьим потомок SID значения делает равного 1113181;
  4. 68943181 не 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> 
+0

Большое спасибо за ваше время и быстрый ответ Майкла ... – Abe

+0

Большое спасибо за ваше время и быстрый ответ Майкл ... я позаботились о точках1,3 и 4. К сожалению, у меня нет привилегии добавлять пространство имен во входной XML-файл, поскольку он генерируется другой системой. Я попробовал , но мог видеть ожидаемый результат. Не могли бы вы пролить свет на это? – Abe

+0

Вы не должны "* добавлять пространство имен во вход xml *". Не предлагает ли предлагаемый XSLT для вас? –