XSL转换将单个节点拆分为同一级别的两个节点

时间:2012-06-29 11:16:17

标签: xslt

我有源XML

<Cars>
  <Car>
    <Make>Fiat</Make>
    <Colors>
      <Color>RED</Color>
      <Color>BLUE</Color>
    </Colors>
  </Car>
  <Car>
    <Make>Volvo</Make>
    <Colors>
      <Color>RED</Color>
      <Color>WHITE</Color>
    </Colors>
  </Car>
  <Car>
    <Make>Renault</Make>
    <Colors>
      <Color>BLUE</Color>
      <Color>BLACK</Color>
    </Colors>
  </Car>
</Cars>

我想转换成像

这样的东西
<Cars>
  <Detail>
    <Name>MakeName</Name>
    <Entry>Fiat</Entry>
    <Entry>Volvo</Entry>
    <Entry>Renault</Entry>
  </Detail>
  <Detail>
    <Name>AvailableColors</Name>
    <Entry>RED</Entry>
    <Entry>BLUE</Entry>
    <Entry>WHITE</Entry>
    <Entry>BLACK</Entry>
  </Detail>
<Cars>

我是XSL的新手,并且创建了一个用于处理的一半,但我仍然坚持将颜色作为目标中的单独元素

<xsl:template match="/">
  <Cars>
    <xsl:apply-templates />
  </Cars>
</xsl:template>

<xsl:template match="Cars">
  <xsl:apply-templates select="Car" />
</xsl:template>

<xsl:template match="Car">
  <Detail>
    <Name>MakeName</Name>
    <xsl:apply-templates select="Make" />
  </Detail>
</xsl:template>

<xsl:template match="Make">
  <Entry><xsl:value-of select"text()"/></Entry>
</xsl:template>

我无法为<Name>AvailableColors</Name>创建XSL,我对XSL很陌生,非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

这是一个XSLT 1.0样式表,展示了如何使用Muenchian grouping消除重复的颜色:

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

<xsl:output indent="yes"/>

<xsl:key name="k1" match="Car/Colors/Color" use="."/>

<xsl:template match="Cars">
  <xsl:copy>
    <Detail>
      <Name>MakeName</Name>
      <xsl:apply-templates select="Car/Make"/>
    </Detail>
    <Detail>
      <Name>AvailableColors</Name>
      <xsl:apply-templates select="Car/Colors/Color[generate-id() = generate-id(key('k1', .)[1])]"/>
    </Detail>
  </xsl:copy>
</xsl:template>

<xsl:template match="Car/Make | Colors/Color">
  <Entry>
    <xsl:value-of select="."/>
  </Entry>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

请参阅此回答中给出的通用“粉碎”解决方案

https://stackoverflow.com/a/8597577/36305