XSLT编号有线行为

  • 本文关键字:编号 XSLT 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伪造样式表

<?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>

我会这样做:

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>

相关内容

  • 没有找到相关文章

最新更新