2012-09-21 3 views
1

다음과 같은 경우가 있습니다. 2 xml 파일 병합 작업 중입니다. 두 파일에서 특정 유형의 노드를 비교하여 해당 특정 속성이 동일한 지 확인합니다. 해당 속성이 동일한 경우 해당 노드를 병합하고 그렇지 않으면 파일 1의 노드를 복사합니다. 아래 논리를 참조하십시오매개 변수의 값을 수정하고 액세스하려면 어떻게해야합니까?

for-each(file1/nodes) 
    boolean variable var set to false 
    for-each (file2/nodes) 
     when(some_condition) 
     var = true 
    /for-each 
    if(var = false) 
     do-something 
/for-each 

내 문제는이 변수를 설정하고 유지할 수 없다는 것입니다. xslt를 처음 접했을 때 xslt를 사용하여이 작업을 수행하는 데 도움이 필요합니다. 귀하의 booleanVariable

<xslt:for-each select="$file1_coverage/packages/package"> 
<xslt:variable name="file1_package_name" select="@name" /> 
<!-- I want to declare a boolean variable and set it false--> 
<xslt:for-each select="$file2_coverage/packages/package"> 
    <xslt:variable name="file2_package_name" select="@name" /> 
    <xslt:choose> 
     <xslt:when test="$file1_package_name=$file2_package_name"> 
      <!-- Set the boolean variable to true--> 
      <package> 
       <xslt:attribute name="branch-rate"> 
        <xslt:value-of select="(($file1_package_branch_rate * $file1_package_branch_total) + ($file2_package_branch_rate * $file2_package_branch_total)) div ($file1_package_branch_total + $file2_package_branch_total)" /> 
       </xslt:attribute> 
      </package> 
     </xslt:when> 
</xslt:for-each> 
<xslt:when test="boolean Variable is false">         
     <package> 
      <xslt:copy-of select="$file1_package/@*" /> 
      <xslt:copy-of select="$file1_package/*" /> 
     </package> 
</xslt:when> 
</xslt:for-each> 
+0

간단한 샘플 입력과 예상 출력을 게시 할 수 있습니까? 또한 XSLT의 어떤 버전입니까? –

+0

샘플 코드가 추가되었습니다. 내 요구 사항은 주석에 있습니다. – Messiah

+0

XSLT로 작성하려는 XML 입력 샘플 및 해당 출력 샘플을 게시하는 것을 고려하면 여기에있는 사람들이 올바른 XSLT 접근 방법을 사용하여이를 해결할 수 있습니다. 나는 긴급한 의사 코드를 게시하는 것이 XSLT가 긴급한 언어가 아니기 때문에 구체적인 XSLT 코드를 제공하는 것을 허용하지 않는다는 것을 두려워한다. 그리고 두 개의 입력 문서로 작업하는 것처럼 보이기 때문에 다른 입력 문서 (예 :'key ('key-name', 'key-name')와의 상호 참조를 쉽게 지원하기 때문에 XSLT 1.0 또는 2.0으로 작업하는지 여부를 알려주십시오. 키 - 값 ', documentNode)'). –

답변

0

첫 번째 xsl:when 후 범위를 벗어나 - 그 범위는 부울 변수를 정의 할 수있는 정확하고 유용한 방법은 xsl:when

내부에만입니다 :

<xsl:variable name="vboolVar"> 
<xsl:choose> 
    <xsl:when test="some-condition">true</xsl:when> 
    <xsl:otherwise></xsl:otherwise> 
</xsl:choose> 
</xsl:variable> 

그런 다음이 변수를 상위 요소의 범위에서 사용하십시오.

물론, 하나는하여 동일한 정의 할 수 있습니다 :

<xsl:variable name="vboolVar" select="some-condition"/> 
0

당신은 부울 변수가 필요하지 않습니다. 대신에 두 개의 루프를 사용하십시오. 처음에는 일치하는 모든 항목을 처리하고 두 번째 항목에서는 일치하지 않는 항목을 처리합니다.

<xslt:for-each select="$file1_coverage/packages/package"> 
    <xslt:variable name="file1_package_name" select="@name" /> 
    <!-- handle all matching entries --> 
    <xslt:for-each select="$file2_coverage/packages/package"> 
         <xslt:variable name="file2_package_name" select="@name" /> 
     <xslt:choose> 
          <xslt:when test="$file1_package_name=$file2_package_name"> 
              <package> 
                  <xslt:attribute name="branch-rate"> 
                       <xslt:value-of select="(($file1_package_branch_rate * $file1_package_branch_total) + ($file2_package_branch_rate * $file2_package_branch_total)) div  
          ($file1_package_branch_total + $file2_package_branch_total)" /> 
        </xslt:attribute> 
       </package> 
      </xslt:when> 
     <xslt:choose> 
    </xslt:for-each> 
    <!-- … and now the not matching entries --> 
    <xslt:for-each select="$file2_coverage/packages/package"> 
         <xslt:variable name="file2_package_name" select="@name" /> 
     <xslt:choose> 
          <xslt:when test="not ($file1_package_name=$file2_package_name)"> 
              <package> 
                 <xslt:copy-of select="$file1_package/@*" /> 
              <xslt:copy-of select="$file1_package/*" /> 
       </package> 
      </xslt:when> 
     <xslt:choose> 
    </xslt:for-each> 
</xslt:for-each> 
관련 문제