2015-04-02 69 views
0

我有子節點 我可以有字FO之間的循環:塊不是像另一個詞:寫混合節點(標籤+文本)只更換特定的節點

<mynode> 
Hi ok 
<fo:block> 
hi ok fo block 
< /fo:block> 
maybe another text node here... 
</mynode> 

我有<div>更換<fo:block>但我不得不離開在同一位置的文本(前,後FO可能:如果存在塊)

我試試這個代碼,但(假設循環子(*)節點):

<xsl:for-each select="/mynode"> 
    <xsl:if test="text()"><xsl:value-of select="text()"/></xsl:if> 
    <xsl:for-each select="child::*"> 
    <!--for every child node of mynode--> 
    <xsl:choose> 
     <xsl:when test="normalize-space(local-name()) 
         = normalize-space('block')"> 
     <xsl:call-template name="fo-block"> 
      <xsl:with-param .../> 
     </xsl:call-template> 
     </xsl:when> 
    <xsl:otherwise> 
     <xsl:if test="text()"><xsl:value-of select="text()"/></xsl:if> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 
</xsl:for-each> 

if test = text()所以節點包含文本然後顯示文本,否則我得到節點的名稱並測試是否是塊:如果是這樣,我調用特定模板,否則測試是否包含文本。

似乎現在工作..所以,可能是我的範圍正確的選擇/代碼?

謝謝!

羅比

回答

0

出現乍一看這些問題包括:

  • 你內心for-each循環遍歷child::*,這將每一個元素的孩子相匹配;它不會匹配任何其他孩子(文本節點,註釋,處理指令)。我認爲你的意思是child::node()

  • 您對塊元素("normalize-space(local-name()) = normalize-space('block')")的測試是不受命名空間限制的,所以它不必要地脆弱。對normalize-space()的調用是毫無意義的,因爲local-name()永遠不會返回任何包含空格的字符串,並且字符串'block'不包含任何空格。

    更短,更可靠的測試將是test="self::fo:block"

  • 你說

    Seems to work for now.. 
    

    如果你的測試表明,該代碼的工作,你的測試是不是你做的多好,他們應該。

你描述似乎用量對你處理的部分:fo:block元素變化div;一切都保持不變。處理這種轉換的最簡單方法是編寫一個標識轉換,然後添加更多特定規則來捕獲需要更改的事物。例如:

<xsl:template match="fo:block"> 
    <div> 
    <xsl:apply-templates select="@*|node()"/> 
    </div> 
</xsl:template> 

<!--* other non-identity processing goes here ... *--> 

<!--* What we don't have specific rules for gets handled 
    * by the following template and the default templates, 
    * which together perform an identity transform. *--> 

<xsl:template match="@*|node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 
</xsl:template> 
+0

什麼是兩個模板匹配'評論(目的)和' '處理指令()'?這些節點已由身份轉換模板處理。AFAICT,這些模板的唯一影響是產生一個錯誤消息「錯誤:模糊規則匹配...」。 – 2015-04-02 18:57:09

+0

我懷疑當我多年前做了我的身份轉換版本時,我將它們考慮在內,因爲我經常想分開處理它們。它們不是按照我最初給出的一般規則來處理的,因爲它們不匹配匹配模式'@ * | *'(除非我在這裏丟失了某些東西)。但是,如果你喜歡,我可以讓你的觀察真實,並刪除它們 – 2015-04-03 00:56:30

0

男,

您的架構和響應是非常有用的

我增加了複雜到我的FO:塊翻譯:考慮HTML替代的屬性,如果IM在一個表(在一個FO:電池父)我div的使用,否則(任何地方)p ..所以,我做出這些改變,希望大家都同意:

<xsl:template match="fo:block"> 

<xsl:choose> 
<xsl:when test="parent::fo:table-cell"> 
<div> 
    <xsl:apply-templates select="node()"/> 
</div> 
</xsl:when> 
<xsl:otherwise> 
    <xsl:if test="@space-before"> <!-- distance before is rep. by br --> 
     <xsl:call-template name="count-br"> <!-- write a br tag for each unit --> 
      <xsl:with-param name="howmuch"><xsl:value-of select="substring-before(normalize-space(@space-before),'cm')"/></xsl:with-param> 
     </xsl:call-template> 
    </xsl:if> 
<p> 
    <xsl:if test="@font-size"> 
     <xsl:attribute name="font-size"><xsl:value-of select="@font-size"/></xsl:attribute> 
    </xsl:if> 
    <xsl:if test="@text-align"> 
     <xsl:attribute name="text-align"><xsl:value-of select="@text-align"/></xsl:attribute> 
    </xsl:if> 
    <xsl:if test="@font-family"> 
     <xsl:attribute name="font-family"><xsl:value-of select="@font-family"/></xsl:attribute> 
    </xsl:if> 
    <xsl:apply-templates select="node()"/>   
</p> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:template>