使用xslt转换参数的内容

时间:2016-09-22 14:24:56

标签: xml xslt xpath

我有一个xml文档,结构大致如下:

<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文档,只能更新原始属性值。我想以我转换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仍然相对较新,所以我不确定我是否提出了正确的问题。我对任何不同的方法持开放态度,尽管我试图避免直接解析字符串值。我很乐意在任何需要的地方提供澄清。

1 个答案:

答案 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>

...