2013-09-13 4 views
0

Я новичок в преобразовании xsl и действительно не нашел решения для своей проблемы в Интернете.добавить значения одного и того же идентификатора с xsl

У меня есть файл XML, который выглядит следующим образом:

<xml> 
<id>1</id> 
<value>abc</value> 
<id>1</id> 
<value>def</value> 
<id>2</id> 
<value>xyz</value> 
<id>2</id> 
<value>hij</value> 
. 
. 
</xml> 

Теперь я нужен XML, который прилагаемое значение, как:

<xml> 
<id>1</id> 
<value>abc, def</value> 
<id>2</id> 
<value>xyz, hij</value> 
. 
. 
</xml> 

Может ли мне помочь в этом вопросе, как это сделать с xslt?

У меня нет точно того формата, который я вам дал. На самом деле это выглядит следующим образом:

<xml> 
<objects> 
<record> 
<attribute> 
<id>1</id> 
<valuegroup> 
<value>abc</value> 
</valuegroup> 
</attribute> 
</record> 

<record> 
<attribute> 
<id>1</id> 
<valuegroup> 
<value>def</value> 
</valuegroup> 
</attribute> 
</record> 

<record> 
<attribute> 
<id>2</id> 
<valuegroup> 
<value>hij</value> 
</valuegroup> 
</attribute> 
</record> 

<record> 
<attribute> 
<id>2</id> 
<valuegroup> 
<value>xyz</value> 
</valuegroup> 
</attribute> 
</record> 
</objects> 
</xml> 

Извините за мою невнимательность.

+0

Рассмотрим, чтобы задать новый вопрос с новым форматом ввода и соответствующий который вам нужен. –

ответ

1

С процессором XSLT 2.0, как Saxon 9 или AltovaXML или XmlPrime вы можете использовать

<xsl:template match="xml"> 
    <xsl:copy> 
    <xsl:for-each-group select="value" group-by="preceding-sibling::id[1]"> 
     <id><xsl:value-of select="current-grouping-key()"/></id> 
     <value><xsl:value-of select="current-group()" separator=", "/></value> 
    </xsl:for-each-group> 
    </xsl:copy> 
</xsl:template> 

С XSLT 1.0:

<xsl:key name="k1" match="xml/value" use="preceding-sibling::id[1]"/> 

<xsl:template match="xml"> 
    <xsl:copy> 
    <xsl:apply-templates select="value[generate-id() = generate-id(key('k1', preceding-sibling::id[1])[1])]"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="value"> 
    <xsl:copy-of select="preceding-sibling::id[1]"/> 
    <value> 
    <xsl:for-each select="key('k1', preceding-sibling::id[1])"> 
     <xsl:if test="position() > 1"><xsl:text>, </xsl:text></xsl:if> 
     <xsl:value-of select="."/> 
    </xsl:for-each> 
    </value> 
</xsl:template> 
Смежные вопросы