我的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一起使用?
答案 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() < 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()
在文本值之间放置逗号。