2009-07-18 5 views
0

내 XML은 다음과 같습니다XSLT 차일 값으로 요소 값을 변환

<element> 
    <AttrValue someatt="a"> 
    <StyledElement> 
     <Container /> 
     <StyledElement> 
     <Paragraph /> 
     <StyledElement> 
      <PlainText someValue="some Text" /> 
     </StyledElement> 
     </StyledElement> 
     <StyledElement> 
     <Paragraph /> 
     <StyledElement> 
      <PlainText TextValue="another Text" /> 
     </StyledElement> 
     </StyledElement> 
    </StyledElement> 
    </AttrValue> 
</element> 

의 출력은, 다음과 같이됩니다

<element> 
    <AttrValue someatt="a"> some Text , another Text (text from child nodes - seperated by comma) </AttrValue> 
</element> 

나는이 같은 여러 요소가 그래서 아마 그와 함께해야이 각각?

+0

출력이 같이해야하며, 출력은 다음과 같아야합니다 \t 나는 더 읽기 대안으로 별도의 템플릿을 추천합니다 일부 텍스트, 다른 텍스트 (자식 노드의 텍스트 - 쉼표로 구분) - 나는 이와 같은 복합 요소가 있으므로 어쩌면 for-each와 함께 있어야합니까? 감사합니다 ... –

+2

설명 제목, 코드 언어, 최종 목표, 배경, 모두가 대답 할 가능성이 더 많은 설명이 포함 된 질문을 만듭니다. –

+0

네,이 질문을 정리하십시오. 주석이 혼란 스러울 때까지 질문하지 않았다고하는 사실. 당신이 그것을 고치지 않고 어떤 대답을 얻을 지 확신하지 못합니다. –

답변

0

두 번째 <PlainText> 요소의 TextValue 속성이 잘못 입력되어 실제로는 someValue 속성이라고 가정했습니다.

<xsl:template match="/element"> 
    <element> 
    <xsl:for-each select="AttrValue"> 
     <AttrValue someatt="{@someatt}"> 
     <xsl:for-each select="//PlainText"> 
      <xsl:if test="position() != 0">, </xsl:if> 
      <xsl:value-of select="@someValue"/> 
     </xsl:for-each> 
     </AttrValue> 
    </xsl:for-each> 
    </element> 
</xsl:template> 

이 기본적으로 중첩 <xsl:for-each> 루프 : 여기

은 일을해야 할 몇 가지 XSLT이다. 유일한 "트릭"은 position()을 사용하여 텍스트 값 사이에 쉼표를 배치하는 방법입니다.

+0

좋아요, 우선 덕분에 작은 변화는 'someValue'앞에 '@'를 추가하는 것입니다. 왜냐하면 그 속성은 ... 큰 xml의 일부만 요소가 다른 노드에 의해 감싸는 것을 의미하고 내가 XML에 대한 복제를 사용할 수있는 동일한 구조를 유지하고 요소 부분만을 변경하고 싶습니까? –

1

<xsl:for-each>이 필요하지 않습니다. 소스 XML에

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

    <xsl:template match="element"> 
    <xsl:copy> 
     <xsl:apply-templates select="AttrValue" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="AttrValue"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates select=".//PlainText/@*" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="PlainText/@*"> 
    <xsl:value-of select="." /> 
    <xsl:if test="position() &lt; last()">, </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

출력 :

<element> 
    <AttrValue someatt="a">some Text, another Text</AttrValue> 
</element>