2011-05-16 4 views
2

값을 추출해야하는 XML 스키마가 있지만 많은 행운이 없습니다.XSLT foreach 노드를 반복적으로 반복합니다.

souce에 스키마는 다음과 같습니다

<Reading> 
    <State> 
     <StateValues> 
     <Name> 
     <Value> 
     </StateValues> 
    </State> 
<Reading> 

는 XML의 예는 다음과 같습니다

<Readings> 
    <Reading1>1234</Reading1> 
    <Reading2>2345</Reading2> 
    <Reading3>4321</Reading3> 
</Readings> 

난 통제가 :

<Reading> 
    <State> 
     <StateValues> 
     <Name>Reading1</Name> 
     <Value>1234</Value> 
     </StateValues> 
     <StateValues> 
     <Name>Reading2</Name> 
     <Value>2345</Value> 
     </StateValues> 
    </State> 
    <State> 
     <StateValues> 
     <Name>Reading3</Name> 
     <Value>4321</Value> 
     </StateValues> 
    </State> 
<Reading> 

내가하는 결과를 필요 스키마.

xsl:foreach을 사용하여 이름을 확인하는 xsl:if으로 시도했지만 처음 값이 3 번 반복됩니다. 어떤 팁? 나는 2 일 동안 이것을 알아 내려고 애 쓰고 있었고 나는 XSLT 전문가가 아니다 ...

고마워. 편집 : 내 XSLT를 게시하지 않아 죄송합니다. 여러 버전을 사용해 보았는데 유용하다고 생각하지 않았습니다. 여기있다 :

인용문

<xsl:element name="ns0:Readings"> 
    <xsl:element name="ns0:Current"> 
     <xsl:for-each select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']">    
      <xsl:choose> 
       <xsl:when test="Name='TOTAL'"> 
      <xsl:element name="ns0:Total"> 
       <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()='Total'" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()='Reading1'"> 
     <xsl:element name="ns0:Reading1"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading2'"> 
     <xsl:element name="ns0:Reading2"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading3'"> 
     <xsl:element name="ns0:Reading3"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
     <xsl:choose> 
      <xsl:when test="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text() = 'Reading4'"> 
     <xsl:element name="ns0:Reading4"> 
      <xsl:value-of select="/*[local-name()='gatewayInterface' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Reading' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='State' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='StateValues' and namespace-uri()='http://biztalk.gateway.com']/*[local-name()='Name' and namespace-uri()='http://biztalk.gateway.com']/text()" /> 
      </xsl:element> 
      </xsl:when> 
     </xsl:choose> 
    </xsl:for-each> 
    </xsl:element> 
</xsl:element> 
+0

사용하려는 XSLT는 무엇인가 복잡성은 여기에 입력 문서의 이름을 얻기 위해 {XPath} 구문을 사용하여 의미있는 동적 요소를 만들고있다? – Richard

+0

사양에 대해 오해했습니다. 코드를 보여 주면 잘못된 위치를 알 수 있습니다. 단순히 해결책을 제시하는 것보다 훨씬 유용합니다. –

+0

나는 당신의 질문을 downvoted했습니다. 당신이 무언가를 시도하고 실패한 경우, 당신이 시도한 것과 실패한 것을 우리에게 말해야합니다. –

답변

5

foreachif은 일반적으로 XSLT에서 잘못된 접근입니다. 패턴에 템플릿을 적용하는 것이 훨씬 더 효과적입니다. 일치가 발견되면 위의 트리거가 핵심 작업을 할 것이다 것을

<xsl:template match='/'> 
    <Readings> 
    <xsl:apply-templates select='Reading/State/StateValues'/> 
    </Readings> 
</xsl:template> 

및 제 : 작업 할 요소를 루트 요소까지 첫 세트와 일치 :이 경우 두 가지를 사용할 수 있습니다 .

<xsl:template match='StateValues'> 
    <xsl:element name='{Name}'> 
    <xsl:value-of select='Value' /> 
    </xsl:element> 
</xsl:template> 
+0

+1 {이름} - 루트 일치를 으로 변경해야했습니다. – StuartLC

+0

@nonnb : XPath를 수정했습니다 ... – Richard

+0

답변 해 주셔서 감사합니다. 나는 이것에 대해 더 많이 배우고 그것을 작동 시키곤했다. 귀하의 도움은 대단히 감사하겠습니다. – Tycho

관련 문제