您发布的片段甚至不是格式正确的 XML,MyObject
开始标签缺少一个>
所以而不是您发布的内容
<MyObject objectInformation="<node1><node2>some Information here</node2><node3><![CDATA[<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Verdana" SIZE="11" COLOR="#403F3F" LETTERSPACING="0" KERNING="0"><B><I>comment in for new object</I></B></FONT></P></TEXTFORMAT>]]></node3><node4>07/18/2013</node4></node1>"></MyObject>
至于使用 Saxon 9 的商业版本进行处理,其中 XSLT 可以访问扩展功能saxon:parse
(或 XSLT/XPath 3.0 parse-xml
),我认为它应该可以工作,但您需要使用它两次,一次是元素objectInformation
属性的值MyObject
,然后是node3
元素的值,所以代码会做例如
<xsl:template match="MyObject">
<xsl:apply-templates select="saxon:parse(@objectInformation)/node()"/>
</xsl:template>
<xsl:template match="node3">
<xsl:apply-templates select="saxon:parse(.)/node()"/>
</xsl:template>
<xsl:template match="TEXTFORMAT">
<!-- now create or transform the elements as needed -->
</xsl:template>
给你一个更完整的例子,当我应用样式表时
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="saxon"
version="2.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="MyObject">
<xsl:apply-templates select="saxon:parse(@objectInformation)/node()"/>
</xsl:template>
<xsl:template match="node3">
<xsl:apply-templates select="saxon:parse(.)/node()"/>
</xsl:template>
<xsl:template match="TEXTFORMAT">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="P">
<fo:block>
<xsl:apply-templates/>
</fo:block>
</xsl:template>
</xsl:stylesheet>
到输入
<MyObject objectInformation="<node1><node2>some Information here</node2><node3><![CDATA[<TEXTFORMAT LEADING="2"><P ALIGN="LEFT"><FONT FACE="Verdana" SIZE="11" COLOR="#403F3F" LETTERSPACING="0" KERNING="0"><B><I>comment in for new object</I></B></FONT></P></TEXTFORMAT>]]></node3><node4>07/18/2013</node4></node1>"></MyObject>
使用 Saxon 9.1.0.8(支持 Saxon 9 的最新开源版本saxon:parse
)我得到了结果
<?xml version="1.0" encoding="UTF-8"?>some Information here<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:block>comment in for new object</fo:block>
</fo:block>07/18/2013
我意识到这不是一个完整且有效的 XSL-FO 文档,但它显示了在输入中转义然后通过解析的元素的模板saxon:parse
被调用。因此,您只需添加更多模板即可根据需要转换其他元素并创建有效的 XSL-FO 文档,如果您需要帮助,我建议您提出一个新问题,概述输入元素所需的 FO 结构。已被解析(即您希望如何转换这些node
元素以及如何转换那些 HTML 元素),那么希望比我更熟悉 XSL-FO 的人可以提供帮助。