2012-11-29 101 views
2

鑑於XSL模板及以下XML,這裏的HTML輸出我想要實現(或多或少):XSLT和嵌套元素

<p> 
foo goes here 
    <span class="content"><p>blah blah blah</p><p>blah blah blah</p></span> 
bar goes here 
    <span class="content">blah blah blah blah blah blah</span> 
</p> 

這裏是什麼是真正得到渲染(的<全部內容span.content>缺失):

<p> 
foo goes here 
    <span class="content"></span> 
bar goes here 
    <span class="content">blah blah blah blah blah blah</span> 
</p> 

這裏是我的模板(片段):

<xsl:template match="note[@type='editorial']"> 
    <span class="content"> 
    <xsl:apply-templates /> 
    </span> 
</xsl> 
<xsl:template match="p"> 
    <p> 
    <xsl:apply-templates /> 
    </p> 
</xsl> 

這裏是我的X ml:

<p> 
foo goes here 
    <note type="editorial"><p>blah blah blah</p><p>blah blah blah</p></note> 
bar goes here 
    <note type="editorial">blah blah blah blah blah blah</note> 
</p> 

呈現特定元素並不重要。即。我不在乎是否渲染了一個< p>或< div>或< span>,只要沒有任何文本元素丟失。 我想避免創建一個匹配「p/note/p」的特定規則,假設< note>元素可以包含任何任意的子元素。

我是一個總的noob到xsl,所以任何額外的提示或指針將非常有幫助。

在此先感謝。

+0

你不顯示''在您的輸入XML中標記您的XSL i試圖匹配。請編輯您的帖子,並在輸入中提供正確位置的''包裝標籤。 –

+0

xml輸入中有兩個元素,即最後的塊引用。頂部的兩個塊是輸出。 – aaronbauman

回答

1

OK,所以我只是瞎忙四周,這裏就是我終於想出瞭解決方案。

嵌套< p>標籤只是不工作。您的瀏覽器不喜歡它們,XSLT也不喜歡它們。所以,我將所有內容切換爲< divs和<跨度>

另外,我在模板的末尾添加了一對全部抓取模板。

這裏是一個的工作不夠好,我的目的最終版本:

<xsl:template match="note[@type='editorial']"> 
    <span class="content"> 
    <xsl:apply-templates /> 
    </span> 
</xsl:template> 

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

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

<xsl:template match="text()"> 
    <xsl:value-of select="." /> 
</xsl:template> 

H/T:

http://www.dpawson.co.uk/xsl/sect2/defaultrule.html

How can xsl:apply-templates match only templates I have defined?

1

您應該使用apply-templates而不是apply-template

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="note[@type='editorial']"> 
     <span class="content"> 
      <xsl:apply-templates/> 
     </span> 
    </xsl:template> 
    <xsl:template match="p"> 
     <p> 
      <xsl:apply-templates /> 
     </p> 
    </xsl:template> 
</xsl:stylesheet> 
+0

謝謝,我修復了原文中的錯字,但仍未解決我的問題。 – aaronbauman

0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <xsl:apply-templates select="p"/> 
    </xsl:template> 
    <xsl:template match="p"> 
    <p> 
    <xsl:apply-templates/> 
    </p> 
    </xsl:template> 
    <xsl:template match="span"> 
    <note type="editorial"> 
    <xsl:choose> 
    <xsl:when test="child::*"> 
    <xsl:copy-of select="child::*"/> 
    </xsl:when> 
    <xsl:otherwise> 
       <xsl:value-of select="."/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </note> 
    </xsl:template> 
    <xsl:template match="text()"> 
    <xsl:copy-of select="."/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

這沒有達到預期的輸出 – aaronbauman