2017-11-28 7 views
2

태그 이름과 상관없이 xml 태그 값을 계산해야하는 시나리오가 있습니다. 다음은 내 XML은, 여기에 내가 XPath는 // 출력에서 ​​G, Y, R의 발생 수를 계산해야하는 XSLT를 사용하여 태그 이름과 상관없이 xml 태그 값 계산

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <result> 
     <value> 
     <color1>G</color1> 
     <color2>Y</color2> 
     </value> 
     <value> 
     <color1>Y</color1> 
     <color2>R</color2> 
     </value> 
    </result> 
    <result> 
     <value> 
     <color1>G</color1> 
     <color2>R</color2> 
     </value> 
     <value> 
     <color1>Y</color1> 
     <color2>R</color2> 
     </value> 
    </result> 
</output> 
  1. 이/
  2. // 출력/결과 내부의 값을 결과입니다해야 남아서 출력에 추가 할 수 있습니다. 아래는 내가 사용하는 XSLT이지만, 항상 원하는 출력은 다음과 같습니다

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> 

    <xsl:template match="/"> 
     <output> 
      <xsl:for-each select="//output/result"> 
      <result> 
    <green><xsl:value-of select="count(/value[./color[*]='G'])" /></green> 
    <red><xsl:value-of select="count(/value[./color[*]='R'])" /></red> 
    <yellow><xsl:value-of select="count(/value[./color[*]='Y'])" /</yellow> 
       <xsl:value-of select="." /> 
      </result> 
     </xsl:for-each> 
     </output> 
    </xsl:template> 
</xsl:stylesheet> 

0으로 계산 제공합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <result> 
    <GreenCount>1</GreenCount> 
<RedCount>1</RedCount> 
<YellowCount>2</YellowCount> 
     <value> 
     <color1>G</color1> 
     <color2>Y</color2> 
     </value> 
     <value> 
     <color1>Y</color1> 
     <color2>R</color2> 
     </value> 

    </result> 
    <result> 
    <GreenCount>1</GreenCount> 
<RedCount>2</RedCount> 
<YellowCount>1</YellowCount> 

     <value> 
     <color1>G</color1> 
     <color2>R</color2> 
     </value> 
     <value> 
     <color1>Y</color1> 
     <color2>R</color2> 
     </value> 
    </result> 
</output> 

답변

1

XSL을 명령형 언어처럼 프로그래밍하려고합니다. 그렇다고 입력 XML이 프로세스를 주도하고 있으며 입력 태그가 템플릿과 일치 할 때 XSL이 "반응합니다".

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="result"> 
     <xsl:copy> 
      <GreenCount><xsl:value-of select="count(value/*[text() = 'G'])"/> </GreenCount> 
      <RedCount><xsl:value-of select="count(value/*[text() = 'R'])"/></RedCount> 
      <YellowCount><xsl:value-of select="count(value/*[text() = 'Y'])"/></YellowCount> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

첫 번째 템플릿은 "항등 변환"입니다 방금 입력에 태그를 추가하고 있기 때문에 변경되지 않은 출력에 복사 입력.

그런 다음 각 result (대한-각하지 XSL, 당신에게 result 요소를 공급 처리의 자연 순서를시키는)에 대한 :

  1. 복사 result 태그
  2. 는 계산에 의해 세 가지 요약 태그를 생성 value 원하는 텍스트를 가진 태그
  3. result 태그의 나머지 내용에 대해 ID 변환을 사용하여 프로세스를 재귀 적으로 다시 호출하여 출력에 복사합니다.

이 다음과 같은 출력을 생성합니다

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <result> 
     <GreenCount>1</GreenCount> 
     <RedCount>1</RedCount> 
     <YellowCount>2</YellowCount> 
     <value> 
      <color1>G</color1> 
      <color2>Y</color2> 
     </value> 
     <value> 
      <color1>Y</color1> 
      <color2>R</color2> 
     </value> 
    </result> 
    <result> 
     <GreenCount>1</GreenCount> 
     <RedCount>2</RedCount> 
     <YellowCount>1</YellowCount> 
     <value> 
      <color1>G</color1> 
      <color2>R</color2> 
     </value> 
     <value> 
      <color1>Y</color1> 
      <color2>R</color2> 
     </value> 
    </result> 
</output> 
+0

당신에게 너무 많은 짐 감사합니다. –