2011-05-01 8 views
1

I는 다음과 같은 구조를 갖는 입력 XML을 가질 증분 노드 값 동적

<VEN> 
<CUS> 
    <MEM> 
    <MEM> 
    <MEM> 
</CUS> 
<CUS> 
    <MEM> 
    <MEM> 
    <MEM> 
</CUS> 

각 노드는 입력 XML에서 여러 번 발생

. 모든 MEM 노드에는 @ CLM01 속성이 있으며이 노드에는 20 건의 MEM 노드마다 값이 할당되어야합니다. 첫 번째 VEN/CUS에서 시작하여 MEM의 노드가 55 개이면 처음 20 개 노드는 @ CLM01 값이 '1'이고 동일한 VEN/CUS 조합의 경우 다음 20 개 노드는 '2'값을 가지며 나머지 노드는 15 개 노드가됩니다. @ CLM01 값은 '3'입니다.

동일한 VEN에서 다음 CUS (이 CUS에는 30 개의 MEM 노드가있는 것으로 가정)의 경우 처음 20 개의 MEM 노드는 @ CLM01 값이 '4'이고 다음 10 개의 MEM은 값이 '5'인 @ CLM01을가집니다. 이것은 계속됩니다 ..... 나는 내가 무엇을 성취하려고하는지 분명히 알기를 바랍니다.

감사합니다. 그것은 가능한가? XSLT 1.0 여기서

를 사용하여 샘플 입력

<Data> 
<VEN vendorId= "v1"> 
    <CUS custId = "c1"> 
     <MEM memId="m1" CLM01=""/> 
     <MEM memId="m2" CLM01=""/> 
     <MEM memId="m3" CLM01=""/> 
     <MEM memId="m4" CLM01=""/> 
     <MEM memId="m5" CLM01=""/> 
    </CUS> 
    <CUS custId = "c2"> 
     <MEM memId="m11" CLM01=""/> 
     <MEM memId="m12" CLM01=""/> 
     <MEM memId="m13" CLM01=""/> 
     <MEM memId="m14" CLM01=""/> 
     <MEM memId="m15" CLM01=""/> 
     <MEM memId="m16" CLM01=""/> 
     <MEM memId="m17" CLM01=""/> 
     <MEM memId="m18" CLM01=""/> 
    </CUS> 
</VEN> 
<VEN vendorId= "v2"> 
    <CUS custId = "c1"> 
     <MEM memId="m4" CLM01=""/> 
     <MEM memId="m5" CLM01=""/> 
     <MEM memId="m6" CLM01=""/> 
     <MEM memId="m7" CLM01=""/> 
     <MEM memId="m8" CLM01=""/> 
    </CUS> 
    <CUS custId = "c1"> 
     <MEM memId="m33" CLM01=""/> 
     <MEM memId="m44" CLM01=""/> 
     <MEM memId="m55" CLM01=""/> 
     <MEM memId="m66" CLM01=""/> 
     <MEM memId="m77" CLM01=""/> 
     <MEM memId="m88" CLM01=""/> 
     <MEM memId="m99" CLM01=""/> 
     <MEM memId="m11" CLM01=""/> 
    </CUS> 
</VEN> 

에게 (우리는 매 3 회 발생 갈 MEM 노드 대신에 20 회 발생) 원하는 출력

<Data> 
<VEN vendorId= "v1"> 
    <CUS custId = "c1"> 
     <MEM memId="m1" CLM01="1"/> 
     <MEM memId="m2" CLM01="1"/> 
     <MEM memId="m3" CLM01="1"/> 
     <MEM memId="m4" CLM01="2"/> 
     <MEM memId="m5" CLM01="2"/> 
    </CUS> 
    <CUS custId = "c2"> 
     <MEM memId="m11" CLM01="3"/> 
     <MEM memId="m12" CLM01="3"/> 
     <MEM memId="m13" CLM01="3"/> 
     <MEM memId="m14" CLM01="4"/> 
     <MEM memId="m15" CLM01="4"/> 
     <MEM memId="m16" CLM01="4"/> 
     <MEM memId="m17" CLM01="5"/> 
     <MEM memId="m18" CLM01="5"/> 
    </CUS> 
</VEN> 
<VEN vendorId= "v2"> 
    <CUS custId = "c1"> 
     <MEM memId="m4" CLM01="6"/> 
     <MEM memId="m5" CLM01="6"/> 
     <MEM memId="m6" CLM01="6"/> 
     <MEM memId="m7" CLM01="7"/> 
     <MEM memId="m8" CLM01="7"/> 
    </CUS> 
    <CUS custId = "c1"> 
     <MEM memId="m33" CLM01="8"/> 
     <MEM memId="m44" CLM01="8"/> 
     <MEM memId="m55" CLM01="8"/> 
     <MEM memId="m66" CLM01="9"/> 
     <MEM memId="m77" CLM01="9"/> 
     <MEM memId="m88" CLM01="9"/> 
     <MEM memId="m99" CLM01="10"/> 
     <MEM memId="m11" CLM01="10"/> 
    </CUS> 
</VEN> 

+0

실제로 구조가 올바른 형식의 입력을 제공하지 않는 이유는 무엇입니까? 그리고 당신이 생산하고자하는 결과물은 무엇입니까? 사람들이 원하는 것을 쉽게 파악할 수 있습니다. – Lumi

+0

@ 마이클 : 네, 맞습니다. 나는 이것이 도움이 될 것 같아요. 감사. 변수에 저장 xsl : number 사용하고 있지만 MEM 매 3 노드마다 값을 증가시키기위한 조건을 달성하는 방법을 모릅니다. – bluesnowxyz

+0

좋은 질문입니다, +1. 완벽한 해결책은 내 대답을 참조하십시오. –

답변

1

이 변환 : 제공된 XML 문서에 적용

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="pSize" select="3"/> 


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

<xsl:template match="/"> 
    <xsl:variable name="vrtfPass1"> 
    <xsl:apply-templates/> 
    </xsl:variable> 

    <xsl:variable name="vPass2" select= 
    "ext:node-set($vrtfPass1)"/> 

    <xsl:apply-templates select="$vPass2/*" mode="pass2"/> 
</xsl:template> 

<xsl:template match= 
    "MEM[not(following-sibling::MEM)]"> 
    <xsl:call-template name="identity"/> 

    <xsl:variable name="vPos" select= 
    "count(preceding-sibling::MEM)+1"/> 

    <xsl:variable name="pTimes" 
     select="$pSize - ($vPos mod $pSize)"/> 

    <xsl:call-template name="genMems"> 
    <xsl:with-param name="pTimes" select="$pTimes"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="genMems"> 
    <xsl:param name="pTimes"/> 

    <xsl:if test="$pTimes >0"> 
    <MEM fake="yes"/> 

    <xsl:call-template name="genMems"> 
    <xsl:with-param name="pTimes" select="$pTimes -1"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

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

<xsl:template match="MEM/@CLM01" mode="pass2"> 
    <xsl:attribute name="CLM01"> 
    <xsl:variable name="vNum"> 
    <xsl:number count="MEM" level="any"/> 
    </xsl:variable> 

    <xsl:value-of select= 
     "ceiling($vNum div $pSize)"/> 
    </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="MEM[@fake='yes']" mode="pass2"/> 
</xsl:stylesheet> 

:

<Data> 
    <VEN vendorId="v1"> 
     <CUS custId="c1"> 
     <MEM memId="m1" CLM01="1"/> 
     <MEM memId="m2" CLM01="1"/> 
     <MEM memId="m3" CLM01="1"/> 
     <MEM memId="m4" CLM01="2"/> 
     <MEM memId="m5" CLM01="2"/> 
     </CUS> 
     <CUS custId="c2"> 
     <MEM memId="m11" CLM01="3"/> 
     <MEM memId="m12" CLM01="3"/> 
     <MEM memId="m13" CLM01="3"/> 
     <MEM memId="m14" CLM01="4"/> 
     <MEM memId="m15" CLM01="4"/> 
     <MEM memId="m16" CLM01="4"/> 
     <MEM memId="m17" CLM01="5"/> 
     <MEM memId="m18" CLM01="5"/> 
     </CUS> 
    </VEN> 
    <VEN vendorId="v2"> 
     <CUS custId="c1"> 
     <MEM memId="m4" CLM01="6"/> 
     <MEM memId="m5" CLM01="6"/> 
     <MEM memId="m6" CLM01="6"/> 
     <MEM memId="m7" CLM01="7"/> 
     <MEM memId="m8" CLM01="7"/> 
     </CUS> 
     <CUS custId="c1"> 
     <MEM memId="m33" CLM01="8"/> 
     <MEM memId="m44" CLM01="8"/> 
     <MEM memId="m55" CLM01="8"/> 
     <MEM memId="m66" CLM01="9"/> 
     <MEM memId="m77" CLM01="9"/> 
     <MEM memId="m88" CLM01="9"/> 
     <MEM memId="m99" CLM01="10"/> 
     <MEM memId="m11" CLM01="10"/> 
     </CUS> 
    </VEN> 
</Data> 

설명 :

<Data> 
    <VEN vendorId= "v1"> 
     <CUS custId = "c1"> 
      <MEM memId="m1" CLM01=""/> 
      <MEM memId="m2" CLM01=""/> 
      <MEM memId="m3" CLM01=""/> 
      <MEM memId="m4" CLM01=""/> 
      <MEM memId="m5" CLM01=""/> 
     </CUS> 
     <CUS custId = "c2"> 
      <MEM memId="m11" CLM01=""/> 
      <MEM memId="m12" CLM01=""/> 
      <MEM memId="m13" CLM01=""/> 
      <MEM memId="m14" CLM01=""/> 
      <MEM memId="m15" CLM01=""/> 
      <MEM memId="m16" CLM01=""/> 
      <MEM memId="m17" CLM01=""/> 
      <MEM memId="m18" CLM01=""/> 
     </CUS> 
    </VEN> 
    <VEN vendorId= "v2"> 
     <CUS custId = "c1"> 
      <MEM memId="m4" CLM01=""/> 
      <MEM memId="m5" CLM01=""/> 
      <MEM memId="m6" CLM01=""/> 
      <MEM memId="m7" CLM01=""/> 
      <MEM memId="m8" CLM01=""/> 
     </CUS> 
     <CUS custId = "c1"> 
      <MEM memId="m33" CLM01=""/> 
      <MEM memId="m44" CLM01=""/> 
      <MEM memId="m55" CLM01=""/> 
      <MEM memId="m66" CLM01=""/> 
      <MEM memId="m77" CLM01=""/> 
      <MEM memId="m88" CLM01=""/> 
      <MEM memId="m99" CLM01=""/> 
      <MEM memId="m11" CLM01=""/> 
     </CUS> 
    </VEN> 
</Data> 

이 원하는 정확한 결과를 생성

  1. 2 패스 변환. 그 결과 각 소자는 그 CUS$pSize 수의 배수 MEM 아이들 갖도록

  2. 첫 번째 패스 가짜 MEM 요소를 추가한다.

  3. 번째 패스 :

  4. 사용하고 identity rule 재정의. <xsl:number>를 사용

  5. level="any"으로 MEM 요소의 정확한 번호를 얻을 수 있습니다.그냥 재미를 위해

+0

+1. 나는 각자의 모든 게시물을 실제로 교육하고 있습니다. 감사! – snoofkin

+0

@ soulSurfer2010 : 환영합니다. –

+1

그러나 OP의 묵시적 그룹은 ''요소를 넘을 수 없으므로 ''의 첫 번째 그룹에는 구성원 수가 최대 인 경우 최대 구성원 수가 항상 있습니다. 나는 약간의 생각을했지만, 해결하기가 어려워 보입니다. – Lumi

1

, 하나의 패스 변환 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="pSize" select="3"/> 
    <xsl:template match="node()|@*"> 
     <xsl:param name="pOffset" select="0"/> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"> 
       <xsl:with-param name="pOffset" select="$pOffset"/> 
       <xsl:with-param name="pPosition" select="position()"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="VEN|CUS"> 
     <xsl:param name="pOffset" select="0"/> 
     <xsl:variable name="vIsVEN" select="self::VEN"/> 
     <xsl:copy> 
      <xsl:apply-templates 
      select="@*|node()[position()=1 and $vIsVEN or not($vIsVEN)]"> 
       <xsl:with-param name="pOffset" select="$pOffset"/> 
      </xsl:apply-templates> 
     </xsl:copy> 
     <xsl:apply-templates select="following-sibling::node()[1]"> 
      <xsl:with-param name="pOffset" 
      select="$pOffset + count(.//MEM[position() mod $pSize = 1])"/> 
     </xsl:apply-templates> 
    </xsl:template> 
    <xsl:template match="MEM/@CLM01"> 
     <xsl:param name="pPosition" select="1"/> 
     <xsl:param name="pOffset" select="0"/> 
     <xsl:attribute name="{name()}"> 
      <xsl:value-of 
      select="$pOffset + ceiling(($pPosition - 1) div $pSize)"/> 
     </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

<Data> 
    <VEN vendorId="v1"> 
     <CUS custId="c1"> 
      <MEM memId="m1" CLM01="1"></MEM> 
      <MEM memId="m2" CLM01="1"></MEM> 
      <MEM memId="m3" CLM01="1"></MEM> 
      <MEM memId="m4" CLM01="2"></MEM> 
      <MEM memId="m5" CLM01="2"></MEM> 
     </CUS> 
     <CUS custId="c2"> 
      <MEM memId="m11" CLM01="3"></MEM> 
      <MEM memId="m12" CLM01="3"></MEM> 
      <MEM memId="m13" CLM01="3"></MEM> 
      <MEM memId="m14" CLM01="4"></MEM> 
      <MEM memId="m15" CLM01="4"></MEM> 
      <MEM memId="m16" CLM01="4"></MEM> 
      <MEM memId="m17" CLM01="5"></MEM> 
      <MEM memId="m18" CLM01="5"></MEM> 
     </CUS> 
    </VEN> 
    <VEN vendorId="v2"> 
     <CUS custId="c1"> 
      <MEM memId="m4" CLM01="6"></MEM> 
      <MEM memId="m5" CLM01="6"></MEM> 
      <MEM memId="m6" CLM01="6"></MEM> 
      <MEM memId="m7" CLM01="7"></MEM> 
      <MEM memId="m8" CLM01="7"></MEM> 
     </CUS> 
     <CUS custId="c1"> 
      <MEM memId="m33" CLM01="8"></MEM> 
      <MEM memId="m44" CLM01="8"></MEM> 
      <MEM memId="m55" CLM01="8"></MEM> 
      <MEM memId="m66" CLM01="9"></MEM> 
      <MEM memId="m77" CLM01="9"></MEM> 
      <MEM memId="m88" CLM01="9"></MEM> 
      <MEM memId="m99" CLM01="10"></MEM> 
      <MEM memId="m11" CLM01="10"></MEM> 
     </CUS> 
    </VEN> 
    <VEN vendorId="v2"> 
     <CUS custId="c1"> 
      <MEM memId="m4" CLM01="1"></MEM> 
      <MEM memId="m5" CLM01="1"></MEM> 
      <MEM memId="m6" CLM01="1"></MEM> 
      <MEM memId="m7" CLM01="2"></MEM> 
      <MEM memId="m8" CLM01="2"></MEM> 
     </CUS> 
     <CUS custId="c1"> 
      <MEM memId="m33" CLM01="3"></MEM> 
      <MEM memId="m44" CLM01="3"></MEM> 
      <MEM memId="m55" CLM01="3"></MEM> 
      <MEM memId="m66" CLM01="4"></MEM> 
      <MEM memId="m77" CLM01="4"></MEM> 
      <MEM memId="m88" CLM01="4"></MEM> 
      <MEM memId="m99" CLM01="5"></MEM> 
      <MEM memId="m11" CLM01="5"></MEM> 
     </CUS> 
    </VEN> 
</Data> 

: 혼합 어린이와 형제 자매 통과. 터널링 매개 변수.