我有一个xml文档,结构大致如下:
<report>
<row>
<field raw="<table> <tr> <td> R1C1 </td> <td> R1C2 </td> </tr> </table>" />
</row>
</report>
据我所知,我无法直接更改xml文档,只能更新原始属性值。我想以我转换xml内容本身的方式转换该值,以便不显示内容:
"<table><tr><td>R1C1</td><td>R1C2</td></tr></table>"
我可以改为匹配转换内容中的标签以生成PDF输出的相应fo标签,类似于能够设置模板以匹配它:
<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节点而且&lt;和&gt;被转义,所以它不能以完全相同的方式匹配。 抱歉,如果我仍然误解了我的请求中的一些核心概念,我对xslt和xpath仍然相对较新,所以我不确定我是否提出了正确的问题。我对任何不同的方法持开放态度,尽管我试图避免直接解析字符串值。我很乐意在任何需要的地方提供澄清。
答案 0 :(得分:0)
使用Saxon 9.7 HE或更高版本或Altova XML Spy支持的XSLT 3.0,您可以使用
<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>
...