2016-09-22 59 views
0

內容我有一個XML文件,大約有如下的結構:轉化參數與XSLT

<report> 
    <row> 
      <field raw="&lt;table&gt; &lt;tr&gt; &lt;td&gt; R1C1 &lt;/td&gt; &lt;td&gt; R1C2 &lt;/td&gt; &lt;/tr&gt; &lt;/table&gt;" /> 
    </row> 
</report> 

我不能直接修改xml文件,據我所知道的,並且只能更新的原始屬性值。我想變換值I轉換XML內容本身的方式,使而不是顯示的內容:

"<table><tr><td>R1C1</td><td>R1C2</td></tr></table>" 

我可以代替匹配的內容中轉換的標籤,生成FO爲PDF標籤對應的輸出,一個類似於能夠建立一個模板來匹配它喜歡:

<xsl:template match="//report/row/field/attribute::raw/table/"> 
    <fo:table> 
     <xsl:for-each select="../tr"> 
      <fo:table-row> 
       <xsl:for-each select="../td"> 
        <fo:table-cell> 
         <xsl:value select= "../" /> 
        </fo:table-cell> 
       </xsl:for-each> 
      </fo:table-row>  
     </xsl:for-each> 
    </fo:table> 
</xsl:template> 

顯然,這是不行的,因爲屬性的內容不會被作爲XML節點處理和<和>逃脫,所以不能以完全相同的方式進行匹配。 如果我仍然誤解了我的請求中的一些核心概念,我還是抱歉,我對xslt和xpath還比較陌生,所以我不確定我是否問的是相當正確的問題。我打開任何不同的方法,但我試圖避免直接解析字符串值。我會很樂意在需要時提供澄清。

回答

0

使用XSLT 3.0等支撐在撒克遜HE 9.7或更高或Altova的XML間諜,你可以使用

<xsl:template match="field/@raw"> 
    <xsl:apply-templates select="parse-xml(.)/table"/> 
</xsl:template> 

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

<xsl:template match="tr"> 
    <fo:table-row> 
    <xsl:apply-templates/> 
    </fo:table-row> 
</xsl:template> 

...