2011-09-07 3 views
0

I 출력이 ParameterSet변환 문자열은

<Parameter> 
    <Expression>2</Expression> 
    <Parametername>InterfaceMethod</Parametername> 
    <Parameter_Opt>EQ</Parameter_Opt> 
    <Parameter_Sign>I</Parameter_Sign> 
    <Range_Low_Value>GenericQuery</Range_Low_Value> 
    <Range_High_Value>NIL</Range_High_Value> 
    </Parameter> 
    <Parameter> 
    <Expression>1</Expression> 
    <Parametername>TargetFilename</Parametername> 
    <Parameter_Opt>EQ</Parameter_Opt> 
    <Parameter_Sign>I</Parameter_Sign> 
    <Range_Low_Value>VendorMaster</Range_Low_Value> 
    <Range_High_Value>NIL</Range_High_Value> 
    </Parameter> 

내 문제는 태그가 <로 변환됩니다입니다 아래처럼 보일 것이다이

&lt;ParameterSet&gt;2|InterfaceMethod|EQ|I|GenericQuery|NIL&lt;/ParameterSet&gt; 
&lt;ParameterSet&gt;1|TargetFilename|EQ|I|VendorMaster|NIL&lt;/ParameterSet&gt; 

같은 등의 입력 구조를 얻고있다 & gt 다른 반복 구조체에 쓸 때 foreach를 사용할 수 없습니다.

누구든지 몇 가지 샘플 코드를 제공 할 수 있습니까?

답변

0

입력 데이터가 XML이 아니므로 인코딩 된 (이스케이프 된) XML 일 수 있습니다. 따라서 올바른 형식의 XML로 변환해야합니다. 즉, 사전 처리를 수행해야합니다. 그런 다음 XSL 변환을 적용하십시오.

+0

예, "XSLT에서도이 전처리를 수행 할 수 있습니까?" 대답은 XSLT 3.0에서 "예"로, 이전 버전에서는 "아마도 프로세서 고유의 확장명을 사용하는 것"으로 보입니다. –

0

xslt는 xml을 xml로 바꾸는 것이 아니라 xml을 다른 xml로 재 배열하는 데 좋습니다. 일 수 있지만 substring-before 등 중첩 된 것을 많이 사용하여 xslt를 사용하면 sed 또는 -delimited 문자열에서 xml을 먼저 생성하여 실행할 수 있다면 훨씬 더 쉽습니다.

3

렉시 컬 XML을 노드 트리로 바꾸는 작업을 구문 분석이라고합니다. 일부 XSLT 프로세서에는 확장 기능이 있습니다. saxon : parse(),이 작업은 XSLT 3.0에서 fn : parse-xml()과 같이 바로 사용할 수 있습니다. 다른 프로세서를 사용하면 Java 또는 Javascript를 호출하여 사용자 고유의 확장 기능을 작성할 수 있습니다.

0

귀하의 의견을 보내 주신 모든 분들께 고맙습니다. XSLT에서이 솔루션을 원했던 것은 내가 가지고있는 프로세서 일뿐 아니라 버전 1.0에서 실행되기 때문입니다. 아래 코드로 작업했습니다.

 <xsl:variable name="TempArea"> 
&lt;ParameterSet&gt;2|InterfaceMethod|EQ|I|GenericQuery|NIL&lt;/ParameterSet&gt; 
&lt;ParameterSet&gt;1|TargetFilename|EQ|I|VendorMaster|NIL&lt;/ParameterSet&gt; 
&lt;ParameterSet&gt;1|CompanyCode|EQ|I|4900|NIL&lt;/ParameterSet&gt;</xsl:when> 
     </xsl:variable> 


      <xsl:call-template name="for.loop.Parameters"> 
       <xsl:with-param name="sourceNodes" select="substring-after($TempArea,'&lt;ParameterSet&gt;')"/> 
      </xsl:call-template> 

    <xsl:template name="for.loop.Parameters"> 
     <xsl:param name="sourceNodes"/> 
     <xsl:variable name="temp"> 
      <xsl:choose> 
       <xsl:when test="string-length($sourceNodes) &gt; '0'"> 
        <xsl:value-of select="substring-before($sourceNodes,'&lt;/ParameterSet&gt;')"/> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:variable> 

     <xsl:variable name="Expression" select="substring-before($temp, '|')"/> 
     <xsl:variable name="remaining" select="substring-after($temp, '|')"/> 
     <xsl:variable name="Name" select="substring-before($remaining, '|')"/> 
     <xsl:variable name="remainingNext" select="substring-after($remaining, '|')"/> 
     <xsl:variable name="Option" select="substring-before($remainingNext, '|')"/> 
     <xsl:variable name="remainingNext1" select="substring-after($remainingNext, '|')"/> 
     <xsl:variable name="Sign" select="substring-before($remainingNext1, '|')"/> 
     <xsl:variable name="remainingNext2" select="substring-after($remainingNext1, '|')"/> 
     <xsl:variable name="LowValue" select="substring-before($remainingNext2, '|')"/> 
     <xsl:variable name="HighValue" select="substring-after($remainingNext2, '|')"/> 

     <Parameter> 
      <Expression> 
       <xsl:value-of select="$Expression"/> 
      </Expression> 
      <Parametername> 
       <xsl:value-of select="$Name"/> 
      </Parametername> 
      <Parameter_Opt> 
       <xsl:value-of select="$Option"/> 
      </Parameter_Opt> 
      <Parameter_Sign> 
       <xsl:value-of select="$Sign"/> 
      </Parameter_Sign> 
      <Range_Low_Value> 
       <xsl:value-of select="$LowValue"/> 
      </Range_Low_Value> 
      <Range_High_Value> 
       <xsl:value-of select="$HighValue"/> 
      </Range_High_Value> 
     </Parameter> 

     <xsl:variable name="test"> 
      <xsl:value-of select="substring-after($sourceNodes,'&lt;/ParameterSet&gt;')"/> 
     </xsl:variable> 
     <xsl:if test="string-length($test)&gt; 1 "> 
      <xsl:call-template name="for.loop.Parameters"> 
       <xsl:with-param name="sourceNodes"> 
        <xsl:value-of select="substring-after($test,'&lt;ParameterSet&gt;')"/> 
       </xsl:with-param> 
      </xsl:call-template> 
     </xsl:if> 
    </xsl:template>