2016-01-18 35 views
0

我無法弄清楚一件非常簡單的事情!XSLT - 轉換清單(TEI)

我想寫一個模板來轉換定義列表。

<list type="gloss"> 
    <head>Slovníček pojmů</head> 
    <label xml:lang="cs">Pojem</label> 
    <item>Dojem!</item> 
    <label xml:lang="cs">Stavba</label> 
    <item>Stavení</item> 
</list> 

當前模板:

<xsl:template match="tei:list[@type='gloss']"> 
    <div class="glossary"> 
     <p> 
      <b> 
       <xsl:apply-templates select="tei:head"/> 
      </b> 
     </p> 
     <dl> 
      <xsl:choose> 
       <xsl:when test="tei:label"> 
        <dt> 
         <xsl:apply-templates select="tei:label"/> 
        </dt> 
       </xsl:when> 
       <xsl:otherwise> 
        <dd> 
         <xsl:apply-templates select="tei:item"/> 
        </dd> 
       </xsl:otherwise> 
      </xsl:choose> 
     </dl> 
    </div> 
</xsl:template> 

沒有什麼工作。我試過for-each循環,由於將模板應用到原子值會產生問題。外部模板(在此之外)通常以錯誤的方式呈現head標記(兩次)。有沒有簡單的方法如何做到這一點?

上面的模板拋出錯誤,提到模板的嵌套調用過多(樣式表可能循環)。

+4

你能表現出更多的XML的和XSLT好嗎?你的XSLT引用了命名空間前綴'tei',但是你沒有顯示這個命名空間的聲明。另外,你的XML根本沒有任何命名空間,所以它不會被'tei:list'匹配。你也應該顯示與'head','label'和'item'匹配的模板,以便我們重現錯誤。謝謝! –

回答

1

這應該與您發佈的片斷工作:

<xsl:template match="list[@type='gloss']"> 
    <div class="glossary"> 
     <p> 
      <b> 
       <xsl:value-of select="head"/> 
      </b> 
     </p> 
     <dl> 
      <xsl:for-each select="label"> 
       <dt> 
        <xsl:value-of select="."/> 
       </dt> 
       <dd> 
        <xsl:value-of select="following-sibling::item[1]"/> 
       </dd> 
      </xsl:for-each> 
     </dl> 
    </div> 
</xsl:template> 

或者,如果你喜歡:

<xsl:template match="list[@type='gloss']"> 
    <div class="glossary"> 
     <xsl:apply-templates select="head"/> 
     <dl> 
      <xsl:apply-templates select="label | item"/> 
     </dl> 
    </div> 
</xsl:template> 

<xsl:template match="head"> 
    <p> 
     <b> 
      <xsl:value-of select="."/> 
     </b> 
    </p> 
</xsl:template> 

<xsl:template match="label"> 
    <dt> 
     <xsl:value-of select="."/> 
    </dt> 
</xsl:template> 

<xsl:template match="item"> 
    <dd> 
     <xsl:value-of select="."/> 
    </dd> 
</xsl:template> 

結果

<div class="glossary"> 
    <p> 
    <b>Slovníček pojmů</b> 
    </p> 
    <dl> 
    <dt>Pojem</dt> 
    <dd>Dojem!</dd> 
    <dt>Stavba</dt> 
    <dd>Stavení</dd> 
    </dl> 
</div> 
+0

它不應該工作!在提供的模板中,沒有dl標籤。有了它,將頭部分開並將其放在整個dl列表上方是個問題。不管怎樣,謝謝你! –

+0

@HonzaHejzl我不確定你的意思。我的答案中顯示的結果與您期望的結果不同嗎? –

+1

@HonzaHejzl如果你展示一個我們可以自己運行的_complete_例子,回答這個問題會更容易。對於XSLT問題,這意味着:XML輸入文檔,XSLT樣式表和您期望的XML輸出。請參閱http://stackoverflow.com/help/mcve。 –