2010-01-26 65 views
1

這從XML to XML using XSL Problem 伸出我設法進口EXSLT和修改根據解決方案(感謝凱爾對接)給我的代碼如下:如何使用EXSLT來解決XML到XML的問題 - 集:不同

<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:func="http://exslt.org/functions" 
       xmlns:set="http://exslt.org/sets" 
       extension-element-prefixes="set"> 

<xsl:import href="set.distinct.function.xsl"/> 

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

<xsl:template match="gallery"> 
    <gallery> 
    <xsl:variable name="gallery" select="."/> 
    <xsl:for-each select="set:distinct(photo/tag/event)"> 
     <xsl:value-of select="."/> 
     <event name="{.}"> 
     <xsl:variable name="event" select="." /> 
     <xsl:for-each select="set:distinct($gallery/object/tag[event=.]/group)"> 
      <group name="{.}"> 
      <xsl:variable name="group" select="." /> 
      <xsl:apply-templates select="$gallery/object[tag/event=$event][tag/group=$group]" /> 
      </group> 
     </xsl:for-each> 
     </event> 
    </xsl:for-each> 
    </gallery> 
</xsl:template> 

但輸出中的錯誤說 - '函數集:distinct()失敗。值不能爲空。'如何解決這個問題?

者均基於XML輸入:

<gallery> 
    <photo> 
    <tag> 
     <event>Birthday</event> 
     <group>Family</group> 
     <other>Swensens</other> 
    </tag> 
    </photo> 
    <photo>..</photo> 
</gallery> 

&所需的XML輸出:

<gallery> 
    <event name="Birthday"> 
    <group name="Family"> 
     <photo> 
     <tag> 
     <other>Swensens</other> 
     </tag> 
     </photo> 
     <photo>..</photo> 
    </group> 
    <group>..</group> 
    </event> 
    <event>..</event> 
</gallery> 

回答

0

當我在你輸入運行XSL原來的樣子,我沒有得到一個錯誤,但是這是我得到的輸出:

<gallery> 
    Birthday 
    <event name="Birthday"/> 
</gallery> 

所以這裏有很多事情沒有讓你到t他輸出你想要的。有一件事是,你只是輸出事件的名稱作爲圖庫節點的值,所以爲了擺脫這一點,你需要刪除< xsl:value-of select =「。」。 />第一個XSL中:對,每個(是這樣的調試代碼留下,也許?)

然後看XSL在這個部分: - 每對事件:

<xsl:variable name="event" select="." /> 
<xsl:for-each select="set:distinct($gallery/object/tag[event=.]/group)"> 

我米看到的幾個問題與集內的XPath:不同:

  1. 在你給XML輸入畫廊節點下方的節點是<照片>,並在你的XPath你有「對象」。
  2. 您沒有使用$ event變量來檢查事件節點 - 標記上的謂詞應該是[event = $ event]。

這些是什麼導致了你所看到的錯誤 - XPath沒有選擇任何東西,所以你打電話set:distinct on null。

所以使得這些修正,輸出我得到的是:

<gallery> 
    <event name="Birthday"> 
    <group name="Family"/> 
    </event> 
</gallery> 

隨後的XPath < XSL:申請模板選擇=「$畫廊/對象[標籤/事件= $事件] [標籤/ group = $ group]「/>需要將對象改爲照片。在我的樣式表我補充,因爲它是不是在你的樣本樣式包括匹配的照片模板,讓我的樣式表,現在看起來像:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:func="http://exslt.org/functions" 
      xmlns:set="http://exslt.org/sets" 
      extension-element-prefixes="set"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="gallery"> 
    <gallery> 
    <xsl:variable name="gallery" select="."/> 
    <xsl:for-each select="set:distinct(photo/tag/event)"> 
     <event name="{.}"> 
     <xsl:variable name="event" select="." /> 
     <xsl:for-each select="set:distinct($gallery/photo/tag[event=$event]/group)"> 
      <group name="{.}"> 
      <xsl:variable name="group" select="." /> 
      <xsl:apply-templates select="$gallery/photo[tag/event=$event][tag/group=$group]" /> 
      </group> 
     </xsl:for-each> 
     </event> 
    </xsl:for-each> 
    </gallery> 
</xsl:template> 

<xsl:template match="photo"> 
    <photo> 
    <tag> 
     <xsl:copy-of select="tag/*[not(name(.)='group') and not(name(.)='event')]" /> 
    </tag> 
    </photo> 
</xsl:template> 
</xsl:stylesheet> 

和輸出我得到的是:

<gallery> 
    <event name="Birthday"> 
    <group name="Family"> 
     <photo> 
     <tag> 
      <other>Swensens</other> 
     </tag> 
     </photo> 
    </group> 
    </event> 
</gallery> 

田田!