2017-09-24 37 views
0

从类似:XSLT - 计数每个元件的位置取决于属性值

<Play> 
    <Character key="Horatio">[...]</Character> 
    <Character key="Hamlet">[...]</Character> 
    <Character key="Ghost">[...]</Character> 
    <Character key="Hamlet">[...]</Character> 
    <Character key="Polonius">[...]</Character> 
    <Character key="Hamlet">[...]</Character> 
    <Character key="Hamlet">[...]</Character> 
    <Character key="Queen">[...]</Character> 
    <Character key="Horatio">[...]</Character> 
</Play> 

我想输出的副本,将通过作为附加属性的那些共享相同的中的每个元件的位置@关键,如:

<Play> 
    <Character key="Horatio" token="1">[...]</Character> 
    <Character key="Hamlet" token="1">[...]</Character> 
    <Character key="Ghost" token="1">[...]</Character> 
    <Character key="Hamlet" token="2">[...]</Character> 
    <Character key="Polonius" token="1">[...]</Character> 
    <Character key="Hamlet" token="3">[...]</Character> 
    <Character key="Hamlet" token="4">[...]</Character> 
    <Character key="Queen" token="1">[...]</Character> 
    <Character key="Horatio" token="2">[...]</Character> 
</Play> 

由于这是一种后续行动较早的排序问题(XSLT – Pass attributes to create parent elements, then order filtered results),我试图用添C'S答案,我的基础,并使用xsl:结合数与它,但我没有成功。

非常感谢!

+2

*我试着使用提姆C的答案* ...请张贴这样的尝试。 – Parfait

回答

0

简单的解决方案是按键对字符进行分组,并使用它们在每个组内的位置。

如果您需要保留原来的顺序(或创造一些其他性质不同的顺序),尝试了不同的方法:

XSLT 2.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="*"/> 

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:key name="grp" match="Character" use="@key" /> 

<xsl:template match="Character"> 
    <Character key="{@key}" token="{index-of(key('grp', @key)/generate-id(), generate-id())}"> 
     <xsl:apply-templates/> 
    </Character> 
</xsl:template> 

</xsl:stylesheet>