2016-06-21 92 views
0

我真的很難理解爲什麼我的方法無效。我正在嘗試分配與c標籤中的文字相關聯的唯一數字ID。出於某種原因,第一個ID是正確計算,但其他所有事件都是空的......如果這很重要,我使用xsltproc。xslt編號有線行爲

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> 

回答

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> 
+0

如果我理解正確的話,你用一種內存碎片,在那裏你進購的元素的「表」的在muenchian分組中的相對位置,然後使用* node-set *來查詢該表。這是我第一次看到這種方法。感謝您的幫助。我大部分時間都被困在這個問題上, –

+1

大部分都是正確的,除了使用'node-set()'函數將變量從*結果樹片段*轉換爲* node-set *。這是XSLT 1.0的一個怪癖:你無法獲得RTF中節點的位置。 –