2013-02-20 49 views
0

我正在嘗試將類似的記錄(同一個UniqueID)與XSL結合起來。將類似的XML記錄/字段與XSL結合使用

這裏是我的XML:

<ExportXML xmlns="http://www.taleo.com/ws/integration/toolkit/2005/07"> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location">Michigan</field> 
    <field name="Category">Math</field> 
    </record> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location">Texas</field> 
    <field name="Category">Science</field> 
    </record> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location"></field> 
    <field name="Category">History</field> 
    </record> 
    <record> 
    <field name="UniqueID">2345</field> 
    <field name="Location">Ohio</field> 
    <field name="Category"></field> 
    </record> 
</ExportXML> 

這裏是想我的輸出看起來像:我的頭在旋轉

<ExportXML> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location">Michigan, Texas</field> 
    <field name="Category">Math, Science, History</field> 
    </record> 
    <record> 
    <field name="UniqueID">2345</field> 
    <field name="Location">Ohio</field> 
    <field name="Category"></field> 
    </record> 
</ExportXML> 

我已經嘗試了很多不同的東西。我仍然對此感到陌生,而且我發現很難學習。

我很可能離開,但這是我到目前爲止。要開始我只是想合併的字段(類別)之一,但它只是重複的所有記錄,而不試圖合併...

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:t="http://www.taleo.com/ws/integration/toolkit/2005/07" 
exclude-result-prefixes="t"> 

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="distinctRecord" match="t:record" use="t:field[@name='UniqueID']" /> 

<xsl:template match="/"> 

    <xsl:for-each select="//t:record[generate-id(.) = generate-id(key('distinctRecord', t:field[@name='UniqueID'])[1])]"> 
    <xsl:variable name="UniqueID" select="t:field[@name='UniqueID']" /> 
    <record> 
      <UniqueID><xsl:value-of select="$UniqueID" /></UniqueID> 
      <Category> 
      <xsl:for-each select="key('distinctRecord', $UniqueID)"> 
        <xsl:if test="position() != 1">, </xsl:if> 
        <xsl:value-of select="t:field[@name='Category']"/> 
      </xsl:for-each> 
      </Category> 
    </record> 
    </xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

任何幫助將不勝感激!

謝謝。

+0

你的輸入XML不能很好地形成的;你介意解決這個問題嗎?另外,你的XSLT樣式表使用了一個不存在於你的輸入XML文件中的名字空間。 – 2013-02-20 13:37:47

回答

1

井是沒有很好地形成的貼輸入樣本,修正當我得到

<ExportXML> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location">Michigan</field> 
    <field name="Category">Math</field> 
    </record> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location">Texas</field> 
    <field name="Category">Science</field> 
    </record> 
    <record> 
    <field name="UniqueID">1234</field> 
    <field name="Location"></field> 
    <field name="Category">History</field> 
    </record> 
    <record> 
    <field name="UniqueID">2345</field> 
    <field name="Location">Ohio</field> 
    <field name="Category"></field> 
    </record> 
</ExportXML> 

然後您發佈的XSLT不使用名稱空間儘管輸入沒有任何,糾正XSLT我得到

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

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="distinctRecord" match="record" use="field[@name='UniqueID']" /> 

<xsl:template match="/"> 

    <xsl:for-each select="//record[generate-id(.) = generate-id(key('distinctRecord', field[@name='UniqueID'])[1])]"> 
    <xsl:variable name="UniqueID" select="field[@name='UniqueID']" /> 
    <record> 
      <UniqueID><xsl:value-of select="$UniqueID" /></UniqueID> 
      <Category> 
      <xsl:for-each select="key('distinctRecord', $UniqueID)"> 
        <xsl:if test="position() != 1">, </xsl:if> 
        <xsl:value-of select="field[@name='Category']"/> 
      </xsl:for-each> 
      </Category> 
    </record> 
    </xsl:for-each> 

</xsl:template> 
</xsl:stylesheet> 

那麼我想你分組你想:

<record> 
    <UniqueID>1234</UniqueID> 
    <Category>Math, Science, History</Category> 
</record> 
<record> 
    <UniqueID>2345</UniqueID> 
    <Category/> 
</record> 

您可以在n進一步編輯XSLT以創建根元素並添加例如

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

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="distinctRecord" match="record" use="field[@name='UniqueID']" /> 

<xsl:template match="/"> 
<ExportXML> 
    <xsl:for-each select="//record[generate-id(.) = generate-id(key('distinctRecord', field[@name='UniqueID'])[1])]"> 
    <xsl:variable name="UniqueID" select="field[@name='UniqueID']" /> 
    <record> 
      <UniqueID><xsl:value-of select="$UniqueID" /></UniqueID> 
      <Location><xsl:value-of select="field[@name='Location']"/></Location> 
      <Category> 
      <xsl:for-each select="key('distinctRecord', $UniqueID)"> 
        <xsl:if test="position() != 1">, </xsl:if> 
        <xsl:value-of select="field[@name='Category']"/> 
      </xsl:for-each> 
      </Category> 
    </record> 
    </xsl:for-each> 
</ExportXML> 
</xsl:template> 
</xsl:stylesheet> 

因此,在你的XSLT的主要分組編碼正確,只是你需要確保你把它應用到一個良好的XML輸入。

+0

非常感謝! – user2091265 2013-02-20 15:06:47

0

此答案取決於您使用XSLT 2.0(Saxon 9.0或更高版本)我正在使用Saxon 9.4.0.4。 這允許使用「爲每個組」。


<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:t="http://www.taleo.com/ws/integration/toolkit/2005/07" 
exclude-result-prefixes="t"> 

<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

<xsl:template match="t:ExportXML"> 
    <ExportXML> 
     <xsl:for-each-group select="t:record" group-by="t:field[@name='UniqueID']"> 
      <record> 
       <field name="UniqueID"> 
        <xsl:value-of select="t:field[@name='UniqueID']"></xsl:value-of> 
       </field> 
       <field name="Location"> 
        <xsl:for-each select="current-group()"> 
         <xsl:if test="position() != 1 and t:field[@name='Location'] &gt; ' '">,</xsl:if> 
         <xsl:value-of select="t:field[@name='Location']"/> 
        </xsl:for-each> 
       </field> 
       <field name="Category"> 
        <xsl:for-each select="current-group()"> 
         <xsl:if test="position() != 1 and t:field[@name='Category'] &gt; ' '">,</xsl:if> 
         <xsl:value-of select="t:field[@name='Category']"/> 
        </xsl:for-each> 
       </field> 
      </record> 
     </xsl:for-each-group> 
    </ExportXML> 
</xsl:template>