为每个特定的子节点复制XML,使用XSLT为每个子节点保留一个完整的副本?

时间:2014-11-04 14:28:06

标签: xml xslt

我有类似于下面的XML。我希望“记录”,如果你愿意的话,基于作者的xml。因此,对于每个作者子节点,我想要每个副本的所有xml和一个作者子节点的完整副本。我已经接近但正确地生成作者让我感到高兴。任何帮助表示赞赏!

示例:

<root>
    <book>
        <name>
        ... some data
        </name>
        <info>
        ... some data
        </info>
        <authors>
            <author> Author 1</author>
            <author> Author 2</author>
        </authors>
        other nodes
        .
    </book>
</root>
=======================
OUTPUT:
<root>
    <book>
        <name>
        ... some data
        </name>
        <info>
        ... some data
        </info>
        <authors>
            <author>Author 1</author>
        </authors>
        other nodes
        .
    </book>
</root>

<root>
    <book>
        <name>
        ... some data
        </name>
        <info>
        ... some data
        </info>
        <authors>
            <author>Author 2</author>
        </authors>
        other nodes
        .
    </book>
</root>

1 个答案:

答案 0 :(得分:1)

这不是一件容易的事 - 尝试:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:copy>
        <xsl:for-each select="book/authors/author">
            <xsl:apply-templates select="ancestor::book">
                <xsl:with-param name="author" select="."/>
            </xsl:apply-templates>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

<xsl:template match="*">
    <xsl:param name="author"/>
    <xsl:copy>
        <xsl:apply-templates select="node()">
            <xsl:with-param name="author" select="$author"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>

<xsl:template match="author">
    <xsl:param name="author"/>
    <xsl:if test=".=$author">
        <xsl:copy-of select="."/>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

注意:如果您可以使用XSLT 2.0处理器,请阅读参数隧道;这将使这个稍微复杂一点。