2016-07-14 102 views
0

我需要将XML转换为XHTML。在XML中有多个段落和嵌入的引文,例如XML到XHTML转换

<para>SomeText</para> 
<para><quote>SomeText</quote></para> 
<para>SomeText</para> 

我尝试这样做:

<xsl:choose> 
    <xsl:when test="//text/para"> 
     <xsl:for-each select="//text"> 
      <xsl:for-each select="//para"> 
       <p><xsl:value-of select="text()"/></p> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:when> 
    <xsl:when test="//text/para[quote]"> 
     <xsl:for-each select="//text"> 
      <xsl:for-each select="//para/quote"> 
       <p><q><xsl:value-of select="text()"/></q></p> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:when> 
</xsl:choose> 

第二个条件只是被忽略。然而。

+0

你需要你做任何更多的编码之前做一些认真读书。阅读模板规则,XPath动态上下文以及路径表达式开始处的“//”的含义。 –

回答

2

由于@LarsH表示,请避免<xsl:for-each>。使用模板匹配。

这个简单的转换:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:template match="para"> 
    <p><xsl:apply-templates /></p> 
    </xsl:template> 

    <xsl:template match="quote"> 
    <q><xsl:apply-templates /></q> 
    </xsl:template> 

</xsl:transform> 

会变成这样:

<text> 
    <para>SomeText</para> 
    <para><quote>SomeText</quote></para> 
    <para>SomeText</para> 
</text> 

<p>SomeText</p> 
<p><q>SomeText</q></p> 
<p>SomeText</p> 

进一步阅读这里SO:

+0

非常感谢。但是我有一个模板,可以匹配标题,元数据和内容顶部的根目录。如果我现在在它下面插入这两个模板,我得到这个错误: “元素只能在样式表的顶层使用”。 – Fajeth88

+0

您不能嵌套''(它与''同义)。自行移动这两个模板。另外,它很可能永远不会执行,直到在主模板中的某处添加一个''。像Lars一样,我推荐先阅读关于'的文章。他评论中的链接和我答案中的第一个链接提供了一个介绍。 – Tomalak

+0

好的,我会那样做的。 – Fajeth88

1

问题是您使用的是忽略上下文(除了上下文文档)的XPath表达式,即以//开头的表达式。因此,如果在具有<quote>子元素的文档中的任何位置有任何<para>元素,则第一个条件将始终为真,并且第二个条件将永远不会到达。

真的想在选择/时间条件之外移动for-each循环(或者更好,一组带有匹配模式和apply-templates的模板)。事实上,一旦拥有合适的模板,您可能不需要选择/根本不需要选择。

XSLT和XPath(从评论一些信息动态)是非常复杂,它真的很值得尝试得到的东西通过试错工作之前学习的基础知识。这样可以节省很多时间。对于一般的介绍,我会建议

那么对于xsl:for-eachxsl:apply-templates更先进的讨论,请参阅

+0

Thx,我会试试。无论如何,我弄清楚了 - 这是我第一次使用XML/HTML。 – Fajeth88

+1

@ Fajeth88:在做大量的反复试验之前,确实值得学习基础知识。即使你了解它们,XSLT/XPath也足够复杂。一旦阅读了关于for-each和apply-templates的教程,请尝试http://stackoverflow.com/questions/4460232/differences-between-for-each-and-templates-in-xsl – LarsH