我真的很难理解为什么我的方法不起作用。我正在尝试为 c 标记中的文本分配唯一的数字ID。出于某种原因,第一个id被正确计算,但所有其他的出现都是空的...如果这很重要,我使用xsltproc。
xml输入
<a>
<b><c>one</c></b>
<b><c>two</c></b>
<b><c>one</c></b>
<b><c>three</c></b>
<b><c>two</c></b>
<b><c>four</c></b>
<b><c>one</c></b>
</a>
预期的xml输出
<?xml version="1.0"?>
<gg>
<ff id="1">one</ff>
<ff id="2">two</ff>
<ff id="1">one</ff>
<ff id="3">three</ff>
<ff id="2">two</ff>
<ff id="4">four</ff>
<ff id="1">one</ff>
</gg>
实际错误输出:
<?xml version="1.0"?>
<gg>
<ff id="1">one</ff>
<ff id="2">two</ff>
<ff id="">one</ff>
<ff id="3">three</ff>
<ff id="">two</ff>
<ff id="4">four</ff>
<ff id="">one</ff>
</gg>
xslt bogus stylesheet
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="xml" indent="yes"/>
<xsl:key name="groups" match="//b" use="c/text()" />
<xsl:template match="/a">
<gg>
<xsl:apply-templates select="b"/>
</gg>
</xsl:template>
<xsl:template match="b">
<xsl:variable name="ff">
<xsl:call-template name="groupd">
<xsl:with-param name="cc" select="c" />
</xsl:call-template>
</xsl:variable>
<ff id="{$ff}"><xsl:value-of select="c"/></ff>
</xsl:template>
<xsl:template name="groupd">
<xsl:param name="cc" select="."/>
<xsl:number
count="//b[generate-id() = generate-id(key('groups', c/text())[1])]"
format="1" />
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:2)
我这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="group" match="b" use="c"/>
<xsl:template match="/a">
<xsl:variable name="groups">
<xsl:for-each select="b[generate-id() = generate-id(key('group', c)[1])]">
<group num="{position()}" val="{c}"/>
</xsl:for-each>
</xsl:variable>
<gg>
<xsl:for-each select="b">
<ff id="{exsl:node-set($groups)/group[@val=current()/c]/@num}">
<xsl:value-of select="c"/>
</ff>
</xsl:for-each>
</gg>
</xsl:template>
</xsl:stylesheet>