2011-09-13 1 views
0

하나의 xml 형식을 다른 xml 형식으로 변환하려면 xsl을 사용하고 있습니다. 내 xsl 파일에는 몇 가지 템플릿을 작성했습니다. 아래의 번역 순서와 관련하여 몇 가지 문제에 직면하고 있습니다.구문 분석 xsl을 사용하여 xml 파일 순서를 기반으로

내 XSL 템플릿 :

<xsl:template match="rhs" name="rhsTemplate"> 

       <xsl:if test="brl:retract | retract!= ''"> 
        <xsl:for-each select="brl:retract | retract"> 
         <xsl:element name="freeForm"> 
          <xsl:element name="text"> 
           <xsl:apply-templates select="." /> 
          </xsl:element> 
         </xsl:element> 
        </xsl:for-each> 
       </xsl:if> 


    <xsl:if test="brl:tryCatchBlock | tryCatchBlock!= ''"> 
         <xsl:if test="brl:tryCatchBlock/brl:try | tryCatchBlock/try!= ''"> 
          <xsl:element name="freeForm"> 
           <xsl:element name="text"> 
            <xsl:text>try{</xsl:text> 
           </xsl:element> 
          </xsl:element> 


</xsl:template> 

내가 하나를 원하지 않는 출력을 얻고 입력으로 다음과 같은 XML 파일을 보내

.

       <rhs> 
           <tryCatchBlock identifier="8" order="0"> 
           <try> 
           </try> 
           </tryCatchBlock> 
       <retract identifier="1" order="1"> 
        <variableName>$Event1</variableName> 
       </retract> 

출력 :

<freeForm> 
<text>retract($Event1);</text> 
</freeForm> 
<freeForm> 
<text>try{</text> 
</freeForm> 

원하는 출력 :

<freeForm> 
<text>try{</text> 
</freeForm> 
<freeForm> 
<text>retract($Event1);</text> 
</freeForm> 

내의 requirment가 번역 입력 XML 파일 order.Here에 따라 일어날 필요가 XSL 템플릿 내부에 관계없이 조건입니다 내 xsl 템플릿에서 trycatch 전에 retract 조건이 있다면 condition.hence "retract"에 대한 번역이 먼저 발생하고 trycatch 태그를 번역하여 입력 x ml는 태그를 철회하기 전에 trycatch 태그를 포함합니다.

입력 XML 콘텐츠 순서에 따라 번역을 수행 할 수있는 몇 가지 지침을 제공해주십시오. 그러나 원하는 출력은 다음과 같습니다 (입력 xml 순서대로).

+0

나는 당신의 문제를 자세하게 연구하지는 못했지만, 한눈에 'brl : retract | retract! = '''.. 이것이 'brl : retract | brl : 철회! = '''? 즉 네임 스페이스가'retract' 요소에 대한 두 번째 참조에서 지정되지 않았습니다. – Flynn1179

+0

예. brl입니다. 철회 | retract! = ''only.sometimes xml 파일은 네임 스페이스와 함께 제공 될 수도 있고 네임 스페이스가 필요없는 경우도 있습니다.이 두 가지 시나리오를 모두 추가했습니다. – mohan

답변

0

출력 결과가 템플릿 순서에 따라 순서대로 표시됩니다. 그것은 특별히 어떤 철회 블록을 출력하고, try/catch 블록을 출력합니다.

나는 약간의 재 설계 권 해드립니다 :

<xsl:template match="rhs" name="rhsTemplate"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="retract"> 
    <xsl:element name="freeForm"> 
    <xsl:element name="text"> 
     <xsl:apply-templates/> 
    </xsl:element> 
    </xsl:element> 
</xsl:template> 

<xsl:template match="tryCatchBlock"> 
    <xsl:element name="freeForm"> 
    <xsl:element name="text"> 
     <xsl:text>try{</xsl:text> 
    </xsl:element> 
    </xsl:element> 
</xsl:template> 

첫 번째 템플릿이 비어있을 수있다을; XSLT는 기본적으로이 작업을 기본적으로 수행하지만 이름이 주어지면 그 이유가있을 수 있다고 생각했습니다.

분명히 네임 스페이스 문제를 해결하려면이 항목을 확장해야합니다. 솔직하게 말하면, 텍스트 retract(의 출처가 명확하지 않지만,이 솔루션을 사용하면 몇 가지 정보를 얻을 수 있기를 바랍니다.