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 некоторый текст, другой текст (текст из дочерних узлов - разделенный запятой) У меня есть несколько элементов, подобных этому, поэтому, возможно, это должно быть для каждого? thanks alot ... – 2009-07-18 19:55:41

+2

Описательные заголовки, язык кода, конечная цель, некоторый фон, все это делает более наглядный вопрос, на который чаще всего будет дан ответ. –

+0

Да, пожалуйста, очистите этот вопрос. Тот факт, что вы даже не задали вопрос, пока комментарий не смущает. Не уверен, что вы получите ответы без его исправления. –

ответ

0

Я предположил, что атрибут TextValue вашего второго элемента <PlainText> ошибочен и фактически является атрибутом someValue.

Вот некоторые XSLT, которые должны сделать работу:

<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> цикла. Единственным «трюком» является то, как position() используется для размещения запятых между текстовыми значениями.

+0

ОК, в первую очередь спасибо большое небольшое изменение, которое я должен был сделать, это добавить '@' перед «someValue», потому что его атрибут ... второй, если его только часть большого элемента xml означает, что он обернут другими узлами и Я хочу сохранить ту же структуру, могу ли я использовать клон для xml и изменять только часть элемента? – 2009-07-18 22:38:18

1

<xsl:for-each> не требуется для этого. Я рекомендую отдельные шаблоны, как более читаемой альтернативу:

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

Вывод с исходным XML:

<element> 
    <AttrValue someatt="a">some Text, another Text</AttrValue> 
</element> 
Смежные вопросы