2013-04-09 5 views
0

나는 다음과 같은 XMLXSLT mutliple 스타일 시트

<TopLevel> 
    <data m="R263"> 
    <s ut="263firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="263secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
    <data m="R262"> 
    <s ut="262firstrecord" lt="2013-02-16T09:21:40.393" /> 
    <s ut="262secondrecord" lt="2013-02-16T09:21:40.393" /> 
    </data> 
</TopLevel> 

내가 전화 템플릿을 않는 일부 XSLT가이 있지만 제대로 itterating 아니에요.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="data"> 
<xsl:value-of select="@m" /> 
<xsl:variable name="vYourName" select="@m"/> 
    <xsl:choose> 
     <xsl:when test="@m='R262'"> 
      <xsl:call-template name="R262"/> 
     </xsl:when> 
    </xsl:choose> 
    <xsl:choose> 
     <xsl:when test="@m='R263'"> 
      <xsl:call-template name="R263"/> 
     </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template name="R262"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

<xsl:template name="R263"> 
         <xsl:for-each select="/TopLevel/data/s"> 
             Column1=<xsl:value-of select="@ut" /> 
        Column2=<xsl:value-of select="@lt" /> 
      </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

이 나에게 4 개 (<s> level) 기록의 INSEAD (8 개) 기록을 제공합니다. 내 반복과 관련이 있다는 것을 알고 있지만 ...이 문제를 해결하는 방법을 모르겠습니다.

나는 또한 적용되는 스타일 시트 알고하지만 난 그 수수께끼를 해명하지 못했습니다 중 ... 사람 만 <data> 수준에서 m의 값을 확인 <\TopLevel>-<TopLevel>에서 모든 것을 처리 할 XSLT를 도와 줄 수 있다면 그리고 각각 <s> 레벨의 스타일 시트를 적용하면 <s> 레코드가됩니다. 나는 믿음을 초월하여 greateful하게 될 것입니다.

+0

예상되는 결과 XML을 제공 할 수 있습니까? 이렇게하면 원본 XSLT가 원하는 것을 성취 할 수 있는지를 알 수 있습니다. – ABach

+0

사실 저는 각 요소에서 값을 가져 와서 삽입 명령을 반환 할 것입니다 ... 데이터 세트로 반환 할 수 있다는 것을 이해합니다 ... 아직 아이디어가 없습니다 ... 그 다음 질문입니다 ... 결론 위의 예제에서 나는 2 열 (column1과 column2)을 가지고 4 레코드 263firstrecord, 263secondrecord, 262firstrecord, 262secondrecord를 얻을 것으로 기대하고있다. 답장을 보내 주셔서 감사합니다.이 xslt를 사용하여 내 안락 영역 밖에 있습니다. – user2263069

+0

안녕하세요, 적용 - 템플릿 논리에 대한 내 솔루션을 참조하십시오. 감사합니다, 피터 – Peter

답변

1

, 당신은 단지 "s"를 처리하려는 당신이 생산 원하는 출력 모르겠지만, 난 당신이

<xsl:for-each select="/TopLevel/data/s"> 

입니다

<xsl:for-each select="s"> 

로 교체 할 생각 전체 문서에서 모든 "s"요소를 선택하는 대신 현재 처리중인 "데이터"내의 요소를 선택하십시오.

왜 apply-templates를 사용하지 않습니까? 당신은 또한 당신의 스타일 시트가하는 것처럼 텍스트 출력을 제공하려면 다음을 수행 할 수 apply-templatesmatch template를 사용하려는 경우

<xsl:template match="data"> 
    ... 
    <xsl:apply-templates/> 
</xsl:template> 

<xsl:template match="s[../@m='R262']"> 
    ... 
</xsl:template> 

<xsl:template match="s[../@m='R263']"> 
    ... 
</xsl:template> 
+0

그건 정확히 내가하고 싶은 일이지만 유효성을 검사하는 xsl 가져올 수 없습니다 ... 필요한 공백을 계속 ''와' xsl의 줄. 조언을 주시고 다시 감사드립니다. – user2263069

+0

나는 aformentioned 라인의 끝에 다른 것을 추가 할 필요가 있었다 ... 이것은 매우 효과적이다. – user2263069

+0

죄송합니다, 이제 제안 된 코드에서 인용 부호를 수정했습니다. –

0

. 그래서 XSLT는 원래 소스 XML에 적용 :

<?xml version="1.0" encoding="UTF-8"?> 
R263 
    Column1=263firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=263secondrecord 
    Column2=2013-02-16T09:21:40.393 
R262 
    Column1=262firstrecord 
    Column2=2013-02-16T09:21:40.393 
    Column1=262secondrecord 
    Column2=2013-02-16T09:21:40.393 

당신은 기본적으로 단지 s에 일치 속성 "유타"와 "LT"을 제공 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="data"> 
    <xsl:value-of select="@m"/> 
    <xsl:apply-templates select="s"/>  
</xsl:template> 

<xsl:template match="s"> 
    Column1=<xsl:value-of select="@ut"/> 
    Column2=<xsl:value-of select="@lt"/> 
</xsl:template> 

</xsl:stylesheet> 

당신이 출력을 제공합니다. 더 잘 보이는 XML을 출력 할 수도 있습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 
<xsl:template match="/"> 
    <root> 
     <xsl:apply-templates/> 
    </root> 
</xsl:template> 

<xsl:template match="data"> 
    <list> 
     <xsl:apply-templates select="s"/> 
    </list> 
</xsl:template> 

<xsl:template match="s"> 
    <xsl:element name="record"> 
     <xsl:attribute name="m"> 
      <xsl:value-of select="parent::data/@m"/> 
     </xsl:attribute> 
     <item>Column1=<xsl:value-of select="@ut"/></item> 
     <item>Column2=<xsl:value-of select="@lt"/></item> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

당신이 좋은 XML 출력을 줄 것이다 :

이 XSLT 사용

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
<list> 
    <record m="R263"> 
     <item>Column1=263firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R263"> 
     <item>Column1=263secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 
<list> 
    <record m="R262"> 
     <item>Column1=262firstrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
    <record m="R262"> 
     <item>Column1=262secondrecord</item> 
     <item>Column2=2013-02-16T09:21:40.393</item> 
    </record> 
</list> 

을 당신은 좋은 XML 구조를 얻기 위해 약간의 원래 XSLT를 적용해야 . 또한 s을 일치시킬 때 요소 data까지 "올라"속성 값에 대해 R-numbers이 표시됩니다.

템플릿 일치 root은 적절한 XML 루트 요소가 필요합니다. <list> 당신은 또한 당신은 <root>의 자식으로서 <record>을 가지고 있습니다.

나는 그것이 당신이 기대했던 것이며 그것이 주위에서 놀아 보길 바란다.

감사합니다. Peter