需要将系统A对fint的请求转化为系统B的请求。
假设我有一个来自系统 A 的 XML 文档,如下所示:
<root>
<Bundle>
<authors>
<author>
<authorID>100</authorID>
<authorName>Kathisiera</authorName>
</author>
<author>
<authorID>200</authorID>
<authorName>Bates</authorName>
</author>
<author>
<authorID>300</authorID>
<authorName>Gavin King</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Head First Java</bookName>
<bookRefID>100</bookRefID>
</book>
<book>
<bookOrderID>5555</bookOrderID>
<bookName>Head First Servlets</bookName>
<bookRefID>200</bookRefID>
</book>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Hibernate In Action</bookName>
<bookRefID>300</bookRefID>
</book>
</books>
</Bundle>
我必须将此请求放入系统 B 的请求结构中:
<root>
<Bundle>
<authors>
<author>
<authorID>100</authorID>
<authorName>Kathisiera</authorName>
</author>
<author>
<authorID>300</authorID>
<authorName>Gavin King</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Head First Java</bookName>
<bookRefID>100</bookRefID>
</book>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Hibernate In Action</bookName>
<bookRefID>300</bookRefID>
</book>
</books>
</Bundle>
<Bundle>
<authors>
<author>
<authorID>200</authorID>
<authorName>Bates</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>5555</bookOrderID>
<bookName>Head First Servlets</bookName>
<bookRefID>200</bookRefID>
</book>
</books>
</Bundle>
首先,我必须根据 bookOrderID
将 book
分组到 Bundle
中。然后通过将 bookRefID
与 authorID
进行比较,将 author
分组到 Bundle
中。
我尝试使用 xslt 的 key() generate-id()
函数。但无法得到预期的结果。
请帮我找出解决方案。
最佳答案
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="k" match="book" use="bookOrderID"/>
<xsl:key name="a" match="author" use="authorID"/>
<xsl:template match="/root">
<xsl:copy>
<xsl:apply-templates select="//books"/>
</xsl:copy>
</xsl:template>
<xsl:template match="books">
<xsl:apply-templates select="book[generate-id(.) = generate-id(key('k', bookOrderID))]"/>
</xsl:template>
<xsl:template match="book">
<Bundle>
<authors>
<xsl:apply-templates select="key('a', key('k', bookOrderID)/bookRefID)"/>
</authors>
<books>
<xsl:copy-of select="key('k', bookOrderID)"/>
</books>
</Bundle>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
输入:
<root>
<Bundle>
<authors>
<author>
<authorID>100</authorID>
<authorName>Kathisiera</authorName>
</author>
<author>
<authorID>200</authorID>
<authorName>Bates</authorName>
</author>
<author>
<authorID>300</authorID>
<authorName>Gavin King</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Head First Java</bookName>
<bookRefID>100</bookRefID>
</book>
<book>
<bookOrderID>5555</bookOrderID>
<bookName>Head First Servlets</bookName>
<bookRefID>200</bookRefID>
</book>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Hibernate In Action</bookName>
<bookRefID>300</bookRefID>
</book>
</books>
</Bundle>
</root>
输出:
<root>
<Bundle>
<authors>
<author>
<authorID>100</authorID>
<authorName>Kathisiera</authorName>
</author>
<author>
<authorID>300</authorID>
<authorName>Gavin King</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Head First Java</bookName>
<bookRefID>100</bookRefID>
</book>
<book>
<bookOrderID>1111</bookOrderID>
<bookName>Hibernate In Action</bookName>
<bookRefID>300</bookRefID>
</book>
</books>
</Bundle>
<Bundle>
<authors>
<author>
<authorID>200</authorID>
<authorName>Bates</authorName>
</author>
</authors>
<books>
<book>
<bookOrderID>5555</bookOrderID>
<bookName>Head First Servlets</bookName>
<bookRefID>200</bookRefID>
</book>
</books>
</Bundle>
</root>
关于xml - XSLT 1.0 - 分组 xml 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7847003/