2010-05-09 89 views
2

使用XSLT 1.0 - 我有以下xml和我的嘗試執行以下XSL分組問題

  • 組通過將第一場其中id =「1923」,如果值屬性相同
  • 和=「3095」使用值id爲平均的所有字段使用所述值屬性屬性
  • 和平均所有的字段ID爲=「3095」

<?xml version="1.0"?> 
<?xml-stylesheet type="text/xsl" href="Trans.xsl"?> 
<Results> 
    <List count="6"> 
    <Record contentId="1017835" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="1" parentRow="" > 
    <Field id="1923" type="1" value="Test 1"></Field> 
    <Field id="3095" type="4" valueID="3809" value="1" parentId="3809" parentName="5" ></Field> 
    <Field id="3096" type="4" valueID="3809" value="1" parentId="3809" parentName="5" ></Field> 
    </Record> 
    <Record contentId="1017828" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="2" parentRow="" > 
    <Field id="1923" type="1" value="Test 2"></Field> 
    <Field id="3095" type="4" valueID="729" value="2" parentId="729" parentName="2" ></Field> 
    <Field id="3096" type="4" valueID="3809" value="5" parentId="3809" parentName="5" ></Field> 
    </Record> 
    <Record contentId="1017978" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="3" parentRow="" > 
    <Field id="1923" type="1" value="Test 3"></Field> 
    <Field id="3095" type="4" valueID="3808" value="4" parentId="3808" parentName="4" ></Field> 
    <Field id="3096" type="4" valueID="3808" value="4" parentId="3808" parentName="4" ></Field> 
    </Record> 
    <Record contentId="1035463" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="4" parentRow="" > 
    <Field id="1923" type="1" value="Test 2"></Field> 
    <Field id="3095" type="4" valueID="3808" value="4" parentId="3808" parentName="4" ></Field> 
    <Field id="3096" type="4" valueID="730" value="3" parentId="730" parentName="3" ></Field> 
    </Record> 
    <Record contentId="1017985" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="5" parentRow="" > 
    <Field id="1923" type="1" value="Test 1"></Field> 
    <Field id="3095" type="4" valueID="113690" value="10" parentId="113690" parentName="10" ></Field> 
    <Field id="3096" type="4" valueID="113690" value="10" parentId="113690" parentName="10" ></Field> 
    </Record> 
    <Record contentId="1017835" finalFlag="True" levelId="" moduleId="152" primarySortId="" secondarySortId="" parentId="0" row="6" parentRow="" > 
    <Field id="1923" type="1" value="Test 1"></Field> 
    <Field id="3095" type="4" valueID="3809" value="5" parentId="3809" parentName="5" ></Field> 
    <Field id="3096" type="4" valueID="3809" value="5" parentId="3809" parentName="5" ></Field> 
    </Record> 
    </List> 
</Results> 

試圖產生以下使用trans.xsl:

<Records> 
<Data> 
    <Text1923>Test 1</Text1923> 
    <Avg3095>5.33</Avg3095> 
    <Avg3096>5.33</Avg3096> 
</Data> 
<Data> 
    <Text1923>Test 2</Text1923> 
    <Avg3095>3</Avg3095> 
    <Avg3096>4</Avg3096> 
</Data> 
<Data> 
    <Text1923>Test 3</Text1923> 
    <Avg3095>4</Avg3095> 
    <Avg3096>4</Avg3096> 
</Data> 
</Records> 
+0

您使用什麼技術來處理XML? XSL? Java的? 。淨?還有別的嗎? – Oded 2010-05-09 16:42:25

+0

我正在使用.NET 2.0並嘗試轉換上述xml以生成顯示關鍵文本和平均值的儀表板 – Wail 2010-05-09 16:54:30

+0

該轉換基於我試圖創建的xsl文檔 – Wail 2010-05-09 16:57:56

回答

2

下面是使用Muenchian分組的方法一個簡單的XSLT 1.0溶液:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:key name="kFieldById" match="Field" 
    use="@id"/> 

<xsl:key name="kField1923" 
    match="Field[@id='1923']" use="@value"/> 

<xsl:template match="/"> 
    <Records> 
    <xsl:for-each select= 
    "key('kFieldById', '1923') 
     [generate-id() 
     = 
      generate-id(key('kField1923', 
          @value 
         ) 
          [1] 
        ) 
      ] 
    "> 
    <Data> 
     <Text1923> 
      <xsl:value-of select="@value"/> 
     </Text1923> 

     <xsl:variable name="vSubfield3095" select= 
      "key('kField1923',@value) 
         /../Field[@id='3095'] 
      "/> 

     <xsl:variable name="vSubfield3096" select= 
      "key('kField1923',@value) 
         /../Field[@id='3096'] 
      "/> 

     <Avg3095> 
      <xsl:value-of select= 
      "sum($vSubfield3095/@value) 
      div 
      count($vSubfield3095) 
      "/> 
     </Avg3095> 

     <Avg3096> 
      <xsl:value-of select= 
      "sum($vSubfield3096/@value) 
      div 
      count($vSubfield3096) 
      "/> 
     </Avg3096> 
    </Data> 
    </xsl:for-each> 
    </Records> 
</xsl:template> 
</xsl:stylesheet> 

當施加於該轉化提供的XML文檔,想要的,正確的resul被生產

<Records> 
    <Data> 
     <Text1923>Test 1</Text1923> 
     <Avg3095>5.333333333333333</Avg3095> 
     <Avg3096>5.333333333333333</Avg3096> 
    </Data> 
    <Data> 
     <Text1923>Test 2</Text1923> 
     <Avg3095>3</Avg3095> 
     <Avg3096>4</Avg3096> 
    </Data> 
    <Data> 
     <Text1923>Test 3</Text1923> 
     <Avg3095>4</Avg3095> 
     <Avg3096>4</Avg3096> 
    </Data> 
</Records> 
+0

Awesomne​​,非常感謝你是這個偉大的作品 – Wail 2010-05-09 17:38:20

+0

@Wail:很高興它是有用的。如何加註+接受答案? :) – 2010-05-09 17:59:48

+0

accpeted答案,不知道爲什麼它不允許我爲你投票。任何想法,我會很高興投票通過我沒有足夠的分數投票? – Wail 2010-05-10 00:00:52