我对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?
提前致谢...