2009-07-18 7 views
0

Mon XML ressemble à ceci:transformation XSLT valeur de l'élément à Childs valeur

<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> 

La sortie devrait ressembler à ceci:

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

J'ai plusieurs éléments comme celui-ci alors peut-être il devrait être avec pour chaque?

+0

et la sortie devrait ressembler à ceci et la sortie devrait ressembler à ceci: \t du texte, un autre texte (le texte provenant des nœuds enfants - séparé par une virgule) J'ai plusieurs éléments comme celui-ci, alors peut-être que ça devrait être avec for-each? merci beaucoup ... –

+2

Les titres descriptifs, la langue de code, votre but final, un peu d'arrière-plan, tous pour une question plus descriptive qui a plus de chances d'obtenir une réponse. –

+0

Ouais, s'il vous plaît nettoyer cette question. Le fait que vous n'ayez même pas * posé * la question jusqu'à ce qu'un commentaire soit confus. Pas sûr que vous obtiendrez des réponses sans le réparer. –

Répondre

0

J'ai supposé que l'attribut TextValue de votre deuxième élément <PlainText> est mal orthographié et qu'il s'agit en fait d'un attribut someValue.

Voici quelques XSLT qui devrait faire le travail:

<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> 

Ceci est essentiellement une boucle <xsl:for-each> imbriquée. Le seul "truc" est comment position() est utilisé pour placer des virgules entre les valeurs de texte.

+0

ok, tout d'abord merci beaucoup peu de changement que je devais faire est d'ajouter '@' avant le 'someValue' parce que c'est un attribut ... deuxième si c'est seulement une partie de grand xml signifie que l'élément est envelopper par d'autres nœuds et je veux garder la même structure puis-je utiliser clone pour le xml et modifier uniquement la partie de l'élément? –

1

<xsl:for-each> n'est pas nécessaire pour cela. Je recommande des modèles distincts comme l'alternative plus lisible:

<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> 

sortie avec votre XML source:

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