2010-05-09 2 views
2

Использование XSLT 1.0 - У меня есть следующий XML, и я пытается выполнить следующуюXSL Группировка Проблема

  • Group первым полем, где ID = «1923», если значение атрибута одно и то же
  • и средние все поля с идентификатором = «3095», используя значение атрибута
  • и средние все поля с идентификатором = «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? Ява? .СЕТЬ? Что-то другое? – Oded

+0

Я использую .NET 2.0 и пытаюсь преобразовать вышеупомянутый xml, чтобы создать панель управления, отображающую ключевой текст и средние значения. – Wail

+0

Преобразование основано на документе xsl, который я пытаюсь создать. – Wail

ответ

2

Вот простой XSLT 1.0 решение с использованием метода Muenchian Группирование:

<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-документ, запрошенный, правильный результат произведен:

<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

+0

@Wail: Рад, что это было полезно. Как насчет продолжения + принятия ответа? :) –

+0

Согласованный ответ и не уверен, почему он не позволяет мне голосовать за вас. ЛЮБЫЕ идеи, и я буду рад принять участие в голосовании. У меня недостаточно очков для голосования? – Wail

Смежные вопросы