2016-01-18 36 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。 –