问题描述
我是一个非常新的xslt开发人员,在此先感谢您的理解。我有以下xml文档,其中包括期刊及其订阅者(订阅者名称位于“ identifier”属性中):
<?xml version="1.0" encoding="UTF-8"?>
<journals xmlns:xlink="http://www.w3.org/1999/xlink"
<journal name="00002030">
<target identifier="aries" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
<journal name="00000372">
<target identifier="aries" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
<journal name="00002030">
<target identifier="cas" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
<journal name="00000372">
<target identifier="cas" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
</journals>
我想创建具有唯一日记帐元素以及其下方的订户元素的文档。所需的文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<journals xmlns:xlink="http://www.w3.org/1999/xlink"
<journal name="00002030">
<target identifier="aries" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
<target identifier="cas" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
<journal name="00000372">
<target identifier="aries" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
<target identifier="cas" pubdate="01/01/2004">
<targetLink xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href="targets.xml#xpointer(/descendant::subscriber[attribute::name='$subscriberNameFromDoc'])"/>
</target>
</journal>
</journals>
请问您如何建议?预先感谢您的帮助。
解决方法
您可以这样做。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="journals"/>
</xsl:template>
<xsl:template match="journals">
<xsl:copy>
<xsl:for-each-group select="journal" group-by="@name">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:copy-of select="current-group()/target"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>