xslt编号有线行为

时间:2016-06-21 19:40:02

标签: xslt-1.0

我真的很难理解为什么我的方法不起作用。我正在尝试为 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>

1 个答案:

答案 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>