2011-03-24 113 views
1

這裏是我的模板:XSLT轉換XHTML文檔

<xsl:template name="rec"> 
    <xsl:for-each select="*"> 
    <div class="{local-name()}"> 
     <xsl:for-each select="@*"> 
     <xsl:attribute name="data-{local-name()}"> 
      <xsl:value-of select="."/> 
     </xsl:attribute> 
     </xsl:for-each> 
     <xsl:value-of select="text()" /> 
     <xsl:call-template name="rec" /> 
    </div> 
    </xsl:for-each> 
</xsl:template> 

給定一個文檔,像這樣:

<test> 
    <item value="1">Item 1 Text</item> 
    <item value="2">Item 2 Text</item> 
</test> 

以上變換將變成:

<div class="test"> 
    <div class="item" data-value="1">Item 1 Text</div> 
    <div class="item" data-value="2">Item 2 Text</div> 
</div> 

我遇到的問題是,此轉換不能正確地尊重文本節點,並且我沒有足夠的XSLT背景來模擬e如何解決它。這裏的問題:給定的XML像這樣:

<para>This is a <emphasis>paragraph</emphasis> people!</para> 

我想看看下面的輸出:

<div class="para">This is a <div class="emphasis">paragraph</div> people!</div> 

的問題是,我沒有得到這個 - 我得到這個:

<div class="para">This is a <div class="emphasis">paragraph</div></div> 

通知失蹤 '的人!'文本節點。我如何修復上面的XSLT以提供我需要的輸出?

回答

4

一個問題是,

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

只是選擇第一子文本節點的值,並將其輸出。

這樣做正確的最簡單的方法可能是使用<xsl:apply-templates>而不是<xsl:call-template>。的

然後代替

<xsl:for-each select="*"> 

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

可以使用

<xsl:apply-templates /> 

將應用適當的模板,每個子元素和文本節點,爲了不跳過任何。

下面是一個完整的實現:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:template match="*"> 
     <div class="{local-name()}"> 
     <xsl:for-each select="@*"> 
      <xsl:attribute name="data-{local-name()}"> 
       <xsl:value-of select="."/> 
      </xsl:attribute> 
     </xsl:for-each> 
     <xsl:apply-templates /> 
     </div> 
    </xsl:template> 

</xsl:stylesheet> 

注意<xsl:apply-templates/>,這在沒有明確select屬性的操作,並且在上下文節點的所有兒童,包括文本節點,默認情況下。

默認模板用於文本節點。這個模板只是將它們複製到輸出中。

樣品輸入:

<test> 
    <item value="1">Item 1 Text</item> 
    <item value="2">Item 2 Text</item> 
    <para>This is a <emphasis>paragraph</emphasis> people!</para> 
</test> 

產生所需的輸出:

<div class="test"> 
    <div class="item" data-value="1">Item 1 Text</div> 
    <div class="item" data-value="2">Item 2 Text</div> 
    <div class="para">This is a <div class="emphasis">paragraph</div> people!</div> 
</div> 
+0

我想我看到你在這裏做什麼。=)這確實產生了我正在尋找的效果 - 非常感謝! – 2011-03-24 19:12:41

+0

對於正確的答案+1。 – 2011-03-25 12:54:12

+0

+1正確的答案和很好的解釋。 – 2011-03-27 15:03:44