我有类似于下面的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>
答案 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处理器,请阅读参数隧道;这将使这个稍微复杂一点。