输入XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<book name="akhil" root="indian" default_attribute="10">
<type default_attribute="20">novel</type>
<price>200</price>
</book>
<book name="indian" default_attribute="0">
<type default_attribute="0">novel</type>
<price default_attribute="0">100</price>
<category default_attribute="0">thriller</category>
</book>
</root>
所需输出:
<root>
<book name="akhil" default_attribute="10">
<type default_attribute="20">novel</type>
<price default_attribute="0">200</price>
<category default_attribute="0">thriller</category>
</book>
</root>
使用XSLT1.0,我们如何生成此输出?感谢您的帮助。
合并应该以这样的方式进行:如果有根属性,则获取具有根属性值的图书名称,然后将原始图书(具有根属性)与没有根属性的图书合并
如果不存在具有给定根属性值的图书名称,只需要输出当前图书节点
我会使用XSLT中的键来引用具有属性的book
元素。它可能不能满足你的需求,但我希望它能帮助你解决你的问题,只需根据需要进行一些修改:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="book-by-name" match="book" use="@name"/>
<xsl:key name="book-by-root" match="book" use="@root"/>
<!-- Identity transform template to copy nodes and attributes -->
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- template to merge book with @name with match @root's book -->
<xsl:template match="book[@root]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:apply-templates select="key('book-by-name', @root)/*"/>
</xsl:copy>
</xsl:template>
<!-- template to merge @price with value from book[@root]/price -->
<xsl:template match="book[not(@root) and count(key('book-by-root', @name)) > 0]/price">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:value-of select="key('book-by-root', ../@name)/price"/>
</xsl:copy>
</xsl:template>
<xsl:template match="book/@root"/>
<xsl:template match="book[not(@root) and count(key('book-by-root', @name)) > 0]"/>
</xsl:stylesheet>