2011-02-01 55 views
1

我有一個XSL變量誰包含:使用Muenchian分組和變量節點集?

<Products> 
    <product> 
     <productId >1</productId> 
      <textdate>11/11/2011</textdate> 
      <price>200</price> 
     </product> 
    <product> 
     <productId >6</productId> 
      <textdate>11/11/2011</textdate> 
      <price>100</price> 
     </product> 
    <product> 
     <productId >1</productId> 
      <textdate>16/11/2011</textdate> 
      <price>290</price> 
     </product> 
</Products> 

我想重新組合產品是這樣的:

{ product 1 : 
11/11/2011 - 200 
16/11/2011 - 290 } 
{ product 6 
11/11/2011 - 100 } 

用一個簡單的Muenchian algorithme這是可能的,但我不能有一個XSL:關鍵火柴在一個變量上。

編輯

也許我並不清楚,

我有這個XML文檔mydocument.xml我試着改造:

<?xml version="1.0" encoding="utf-8" ?> 
<root> 
    <test>somestuff</test> 
</root> 

我的XSL必須看起來像:

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet version="2.0" xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output omit-xml-declaration="yes" method="xml" encoding="utf-8" /> 

<xsl:variable name="MyProductList" select="document('myresultlist.xml')" />  
<xsl:key name="kProdById" match="$MyProductList/product" use="productId"/> 
<xsl:template match= 
    "product[generate-id() 
      = 
      generate-id(key('kProdById',productId)[1]) 
      ]"> 

    <xsl:value-of select="concat('&#xA;{product ', productId, ' :')"/> 
    <xsl:apply-templates mode="display" 
    select="key('kProdById',productId)"/> 
}<xsl:text/> 
</xsl:template> 

<xsl:template match="product" mode="display"> 
    <xsl:value-of select= 
    "concat('&#xA;', textdate, ' - ', price)"/> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

當我把我的變量$ MyPr oductList在一個匹配的Visual Studio中出現錯誤,當我試圖強制運行我的Web應用程序崩潰。

所以我不能做什麼dimitre解釋我。

謝謝你幫我

+0

@Christophe Debove:只要可變的霍爾ds節點集(輸入源來自哪裏)可以使用Muenchian方法,因爲它來自http://www.w3.org/TR/xslt#function-key:*它返回包含節點集的節點集與上下文節點相同的文檔,該文檔的命名鍵的值等於此字符串*。當然,你應該採用推式,而不是拉風格... – 2011-02-01 17:59:23

+0

Christophe,我同意亞歷杭德羅,只要變量類型是節點集,你可以使用Muenchian分組和鍵沒有任何問題。如果變量不是節點集而是結果樹片段,則可以使用擴展函數,如exsl:node-set($ variable)http://www.exslt.org/exsl/functions/node-set/ index.html將結果樹片段轉換爲首先在其上應用Muenchian分組的節點集。 – 2011-02-01 19:41:32

回答

2

這種變換在其經典的形式Muenchian分組的方法:

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

<xsl:key name="kProdById" match="product" use="productId"/> 

<xsl:template match= 
    "product[generate-id() 
      = 
      generate-id(key('kProdById',productId)[1]) 
      ]"> 

    <xsl:value-of select="concat('&#xA;{product ', productId, ' :')"/> 
    <xsl:apply-templates mode="display" 
    select="key('kProdById',productId)"/> 
}<xsl:text/> 
</xsl:template> 

<xsl:template match="product" mode="display"> 
    <xsl:value-of select= 
    "concat('&#xA;', textdate, ' - ', price)"/> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

時所提供的XML文檔應用,想要的,正確的結果產生

{product 1 : 
11/11/2011 - 200 
16/11/2011 - 290 
} 
{product 6 : 
11/11/2011 - 100 
} 

更新:在OP顯示更多的信息,並解釋說,這個問題(在他的代碼)就是在這兩條線:

<xsl:variable name="MyProductList" select="document('myresultlist.xml')" /> 
<xsl:key name="kProdById" match="$MyProductList/product" use="productId"/> 

解決方案:只需使用:

<xsl:key name="kProdById" match="product" use="productId"/> 

每當你想要參考key()函數中的kProdById密鑰,請確保所需文檔當前爲。在更復雜的情況下,這是在XSLT 1中完成的。以下列方式0:

<!-- Temporarily switch to the document to be indexed --> 
<xsl:for-each select="document('myresultlist.xml')"> 
    <!-- Use here the key() function --> 
</xsl:for-each> 

<!-- Resume working with the main document here --> 

這裏是相同的解決方案,現在施加到包含在一個可變的文檔(其頂部元件):

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

    <my:doc> 
     <Products> 
      <product> 
       <productId >1</productId> 
       <textdate>11/11/2011</textdate> 
       <price>200</price> 
      </product> 
      <product> 
       <productId >6</productId> 
       <textdate>11/11/2011</textdate> 
       <price>100</price> 
      </product> 
      <product> 
       <productId >1</productId> 
       <textdate>16/11/2011</textdate> 
       <price>290</price> 
      </product> 
     </Products> 
    </my:doc> 

    <xsl:variable name="vDoc" select="document('')/*/my:doc/*"/> 

    <xsl:key name="kProdById" match="product" use="productId"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="$vDoc"/> 
    </xsl:template> 

    <xsl:template match= 
     "product[generate-id() 
       = 
       generate-id(key('kProdById',productId)[1]) 
       ]"> 
     <xsl:value-of select="concat('&#xA;{product ', productId, ' :')"/> 
     <xsl:apply-templates mode="display" 
      select="key('kProdById',productId)"/> } 
     <xsl:text/> 
    </xsl:template> 

    <xsl:template match="product" mode="display"> 
     <xsl:value-of select= 
      "concat('&#xA;', textdate, ' - ', price)"/> 
    </xsl:template> 
    <xsl:template match="text()"/> 
</xsl:stylesheet> 

當該變換被應用上任何文件(未使用),再次產生想要的結果:

{product 1 : 
11/11/2011 - 200 
16/11/2011 - 290 } 

{product 6 : 
11/11/2011 - 100 } 
相關問題