2017-12-20 11 views
0

전체 XML에 대해 빈 태그를 제거하는 XSL이 있지만 속성이 "DELETE"일 때 노드 섹션 하나에 대해 빈 태그를 제거하려고합니다. 모든 도움을 주시면 감사하겠습니다. 아래 예제 XML 및 XSL을 참조하십시오.특정 속성을 기반으로 XSL로 빈 노드 제거

XML 예제 : 아래

<?xml version="1.0" encoding="UTF-8"?> 
<UGNX xmlns="http://www.ems-ag.de/xmlschemas/test/UGNX.XSD"> 
    <Items Action="UPDATE"> 
     <PartyCode>TSTeb</PartyCode> 
     <CatalogCode>TestCatalog</CatalogCode> 
     <Item Action="ADDORUPDATE"> 
      <ItemCode>TST12345</ItemCode> 
      <ItemType>REGULAR</ItemType> 
      <ItemState>V</ItemState> 
      <AttributeAttachments Action="UPDATE"> 
       <AttributeAttachment Action="DELETE"> 
        <AttributeUID> 
         <PartyCode>TSTeb</PartyCode>  
         <AttributeClassificationCode>TestSchema 
         </AttributeClassificationCode> 
         <AttributeCode>TestAttribute</AttributeCode> 
        </AttributeUID> 
        <AttributeValues Action="REPLACE"> 
        <Value Action="ADDORUPDATE"> 
         <Order>0</Order> 
         <Enumeration/> 
        </Value> 
        </AttributeValues> 
       </AttributeAttachment> 
      <AttributeAttachment Action="ADDORUPDATE"> 
       <AttributeUID> 
        <PartyCode>TSTeb</PartyCode> 
        <AttributeClassificationCode>TestSchema 
        </AttributeClassificationCode> 
        <AttributeCode>TestAttribute2</AttributeCode> 
       </AttributeUID> 
       <AttributeValues Action="REPLACE"> 
        <Value Action="ADDORUPDATE"> 
         <Order>0</Order> 
         <Translatable/> 
        </Value> 
       </AttributeValues> 
      </AttributeAttachment> 
      </AttributeAttachments> 
     </Item> 
     </Items> 
    </UGNX> 

예상 결과. AttributeAttachment "Action"속성이 "DELETE"이면 빈 노드가 제거됩니다.

<?xml version="1.0" encoding="UTF-8"?> 
<UGNX xmlns="http://www.ems-ag.de/xmlschemas/test/UGNX.XSD"> 
    <Items Action="UPDATE"> 
     <PartyCode>TSTeb</PartyCode> 
     <CatalogCode>TestCatalog</CatalogCode> 
     <Item Action="ADDORUPDATE"> 
      <ItemCode>TST12345</ItemCode> 
      <ItemType>REGULAR</ItemType> 
      <ItemState>V</ItemState> 
      <AttributeAttachments Action="UPDATE"> 
       <AttributeAttachment Action="DELETE"> 
        <AttributeUID> 
         <PartyCode>TSTeb</PartyCode>  
         <AttributeClassificationCode>TestSchema 
         </AttributeClassificationCode> 
         <AttributeCode>TestAttribute</AttributeCode> 
        </AttributeUID> 
        <AttributeValues Action="REPLACE"> 
        <Value Action="ADDORUPDATE"> 
         <Order>0</Order> 
        </Value> 
        </AttributeValues> 
       </AttributeAttachment> 
      <AttributeAttachment Action="ADDORUPDATE"> 
       <AttributeUID> 
        <PartyCode>TSTeb</PartyCode> 
        <AttributeClassificationCode>TestSchema 
        </AttributeClassificationCode> 
        <AttributeCode>TestAttribute2</AttributeCode> 
       </AttributeUID> 
       <AttributeValues Action="REPLACE"> 
        <Value Action="ADDORUPDATE"> 
         <Order>0</Order> 
         <Translatable/> 
        </Value> 
       </AttributeValues> 
      </AttributeAttachment> 
      </AttributeAttachments> 
     </Item> 
     </Items> 
    </UGNX> 

현재 XSL :

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="*"> 
    <xsl:if test=". != '' or ./@* != ''"> 
     <xsl:element name="{local-name()}"> 
      <xsl:apply-templates select="@* | node()" /> 
     </xsl:element> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="@*"> 
     <xsl:attribute name="{local-name()}"> 
      <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 
     <xsl:template match="text() | comment() | processing-instruction()"> 
     <xsl:copy /> 
    </xsl:template> 
</xsl:stylesheet> 
+0

XML이 올바른 형식이 아닙니다. 고쳐주세요. 또한 첫 번째 XML과 두 번째 XML 간에는 차이점이없는 것 같습니다. – zx485

+0

''과 같은 네스트 태그가 있다고 가정 해 보겠습니다. ''이 제거되면''이 비어있게되므로 ''도 제거 하시겠습니까? –

+0

@ zx485 두 번째 XML에서는 일 때이 제거되었습니다. – Toya

답변

1

당신은 템플릿 매칭 중 "빈"요소 "*"확인을 위해 현재 논리를 이동하고 대신 빈 요소를 일치하는 별도의 템플릿이 있고,해야 그들을 무시 .....

<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@* | node()" /> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="*[@Action='DELETE']//*[not(* or @* or normalize-space())]" /> 

여기서는 자식 요소가없고 속성이없고 비 공백 텍스트가없는 것으로 빈을 정의합니다.

+0

도움을 주셔서 대단히 감사드립니다! 완전한! – Toya

+0

작업이 삭제되면 "값"노드 만 제거 할 수 있습니까? – Toya

+0

'ug '는 http : //에 바인드 된 네임 스페이스 접두사이다. (여기서'ug'는'/www.ems-ag.de/xmlschemas/test/UGNX.XSD'). –