XSLT 1.0:对具有类似标记值的项目进行分组

时间:2014-09-23 19:53:43

标签: xml xslt xslt-1.0

我对XSLT有点新意,我试图将具有类似值的特定标签的子元素组合在一起。非常感谢您的帮助。

例如,我的数据结构如下所示:

<root>
    <Persons xmlns:p="http://test1.com" xmlns:pid="http://test1.com/person">
        <Person>
            <Data xmlns="http://test1.com/person">
                <personId>12345</personId>
                <dsId>DS_1</dsId>
                <data>data1</data>
                <ts>2014-09-22</ts>
            </Data>
            <Data xmlns="http://test1.com/person">
                <personId>12345</personId>
                <dsId>DS_2</dsId>
                <data>data2</data>
                <ts>2014-09-22</ts>
            </Data>
            <Data xmlns="http://test1.com/person">
                <personId>12345</personId>
                <dsId>DS_3</dsId>
                <data>data3</data>
                <ts>2014-09-22</ts>
            </Data>
            <Data xmlns="http://test1.com/person">
                <personId>12345</personId>
                <dsId>DS_3</dsId>
                <data>data4</data>
                <ts>2014-09-23</ts>
            </Data>
            <details xmlns="http://test1.com">
                <personId>12345</personId>
            </details>
        </Person>
    </Persons>
</root>

我想从<Data>值对<dsId>项进行分组,然后将xml转换为以下结构。

<personData xmlns="http://test1.com/personData" xmlns:p="http://test1.com" xmlns:pid="http://test1.com/person">
   <matchedResults>
      <person>
         <details>
            <personID xmlns="http://test1.com/person">12345</personID>
         </details>
         <dataSourceResults>
            <ds id="DS_1" name="DS_1">
               <result loadedTimestamp="2014-09-22">
                  <entry>data1</entry>
               </result>
            </ds>
            <ds id="DS_2" name="DS_2">
               <result loadedTimestamp="2014-09-22">
                  <entry>data2</entry>
               </result>
            </ds>
            <ds id="DS_3" name="DS_3">
               <result loadedTimestamp="2014-09-22">
                  <entry>data3</entry>
               </result>
               <result loadedTimestamp="2014-09-23">
                  <entry>data4</entry>
               </result>
            </ds>
         </dataSourceResults>
      </person>
   </matchedResults>
</personData>

请注意,上面的输出消息<ds id="DS_3"..元素包含两个<result..节点元素。

这是我可以提出的最接近的转换(它没有进行分组)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:p="http://test1.com" xmlns:pid="http://test1.com/person">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:template match="/">
        <personData xmlns="http://test1.com/personData">
            <matchedResults>
                <xsl:for-each select="/root/Persons/Person">
                    <person>
                        <details>
                            <personID xmlns="http://test1.com/person"><xsl:value-of select="p:details/p:personId/text()"/></personID>
                        </details>
                        <dataSourceResults>
                            <xsl:for-each select="pid:Data">
                                <xsl:variable name="dsId" select="translate(pid:dsId/text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" />
                                <xsl:if test="not($dsId = '')">
                                    <xsl:element name="ds">
                                        <xsl:attribute name="id"><xsl:value-of select="pid:dsId/text()"/></xsl:attribute>
                                        <xsl:attribute name="name"><xsl:value-of select="pid:dsId/text()"/></xsl:attribute>
                                        <xsl:element name="result">
                                            <xsl:attribute name="loadedTimestamp"><xsl:value-of select="pid:ts"/></xsl:attribute>
                                            <entry><xsl:value-of select="pid:data"/></entry>
                                        </xsl:element>
                                    </xsl:element>
                                </xsl:if>
                            </xsl:for-each>
                        </dataSourceResults>
                    </person>
                </xsl:for-each>
            </matchedResults>
        </personData>
    </xsl:template>
</xsl:stylesheet>

它只给我低于输出。

<personData xmlns="http://test1.com/personData" xmlns:p="http://test1.com" xmlns:pid="http://test1.com/person">
   <matchedResults>
      <person>
         <details>
            <personID xmlns="http://test1.com/person">12345</personID>
         </details>
         <dataSourceResults>
            <ds id="DS_1" name="DS_1">
               <result loadedTimestamp="2014-09-22">
                  <entry>data1</entry>
               </result>
            </ds>
            <ds id="DS_2" name="DS_2">
               <result loadedTimestamp="2014-09-22">
                  <entry>data2</entry>
               </result>
            </ds>
            <ds id="DS_3" name="DS_3">
               <result loadedTimestamp="2014-09-22">
                  <entry>data3</entry>
               </result>
            </ds>
            <ds id="DS_3" name="DS_3">
               <result loadedTimestamp="2014-09-23">
                  <entry>data4</entry>
               </result>
            </ds>
         </dataSourceResults>
      </person>
   </matchedResults>
</personData>

如何修改我必须获得所需转换的xsl?

提前致谢...

0 个答案:

没有答案