基于差异的XSLT合并节点



输入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>

相关内容

  • 没有找到相关文章

最新更新