XSLT将元素值转换为childs值

时间:2009-07-18 19:54:35

标签: xslt

我的XML看起来像这样:

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

我有这样的多个元素,所以也许它应该与for-each一起使用?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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()在文本值之间放置逗号。