2012-07-13 73 views
-1

我有下面的XML文檔:XSLT 1.0文本清單到單個元素和刪除重複

<?xml version="1.0" encoding="UTF-8"?> 
<cars> 
    <car body="Wagon"> 
     <text>Red</text> 
    </car> 
    <car body="Sedan"> 
     <text>Yellow</text> 
    </car> 
    <car body="Sedan"> 
     <text></text> 
    </car> 
    <car body="Wagon"> 
     <textlist> 
      <text>Red</text> 
      <text>Green</text> 
      <text>Black</text> 
      <text>Blue</text> 
     </textlist> 
    </car> 
    <car body="Sedan"> 
     <textlist> 
      <text>Yellow</text> 
      <text>Orange</text> 
     </textlist> 
    </car> 
    <car body="Fastback"> 
     <textlist> 
      <text>Yellow</text> 
      <text>Red</text> 
      <text>Green</text> 
      <text>Black</text> 
      <text>Blue</text> 
     </textlist> 
    </car> 
    <car body="Fastback"> 
     <textlist> 
      <text>Pink</text> 
      <text>Red</text> 
      <text>Orange</text> 
     </textlist> 
    </car> 
</cars> 

使用XSLT 1.0我需要將XML文檔轉換成這種格式:

<?xml version="1.0" encoding="UTF-8"?> 
<cars> 
    <car type="Wagon">Red</car> 
    <car type="Sedan">Yellow</car> 
    <car type="Wagon">Green</car> 
    <car type="Wagon">Black</car> 
    <car type="Wagon">Blue</car> 
    <car type="Sedan">Orange</car> 
</cars> 

注意:

  1. 體= 「快背」 被排除
  2. 重複s的排除(紅色貨車 出現兩次)
  3. 文本清單的多個項目被放置在輸出XML個體 元件
  4. 忽略空值
+0

爲什麼fastback被排除? – Woody 2012-07-13 09:30:58

+0

爲什麼downvote? – 2012-10-08 09:59:32

回答

2

下面是一個示例:

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

<xsl:output indent="yes"/> 

<xsl:key name="k1" 
    match="car[not(@body = 'Fastback')]//text" 
    use="concat(ancestor::car/@body, '|', .)"/> 

<xsl:template match="cars"> 
    <xsl:copy> 
    <xsl:apply-templates select="car[not(@body = 'Fastback')]//text 
     [generate-id() = generate-id(key('k1', concat(ancestor::car/@body, '|', .))[1])]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="text"> 
    <car type="{ancestor::car/@body}"> 
    <xsl:value-of select="."/> 
    </car> 
</xsl:template> 

</xsl:stylesheet> 

它使用Muechian分組,如果您不熟悉該XSLT 1.0方法,請參見http://www.jenitennison.com/xslt/grouping/muenchian.xml

+0

非常有幫助。非常感謝。 – 2012-07-13 10:05:13

+0

試圖理解這是如何工作的,在key('k1',concat(ancestor :: car/@ body,'|',。))[1]'末尾的方括號是什麼意思? – 2012-07-13 13:08:17

+0

[1]選擇鍵控組的頭部。因此,xsl:apply-templates應用於每個組的第一個節點,而不是每個組的每個節點。 – 2012-07-14 14:58:10