XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点

Posted

技术标签:

【中文标题】XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点【英文标题】:XSLT - How to treat inline/escaped XML within a node as nested nodes 【发布时间】:2020-01-07 22:36:19 【问题描述】:

xslt 新手 - 到目前为止不喜欢它。

试图保留一些由转换为 PDF 的应用程序接收的 html(表格)格式。

需要一种 xslt 方法将 XML 节点中的转义 HTML/XML 数据解释为其他子节点吗?

已在该节点上尝试了 v3 parse-xml()。 已尝试使用 v1 搜索/替换模板将 < 转换为 < 等。 试过disable-output-escaping="yes" - 不。

由于某种原因似乎没有任何效果。

源 XML:

<?xml version="1.0" encoding="windows-1252"?>
<Report>
    <node1>node1</node1>
    <node2>node2</node2>
    <node3>node3</node3>
    <node4>
        <node4a_with_nested_xml>Nestedxml text$lt;br/$gt;
            $lt;b$gt;
                $lt;u$gt;blah blah blah$lt;/u$gt;
            $lt;/b$gt;
            $lt;br/$gt;
            $lt;table$gt;
                $lt;tr$gt;
                    $lt;td$gt;
                        $lt;br/$gt;blah blah blah$lt;br/$gt;
                    $lt;/td$gt;
                $lt;/tr$gt;
            $lt;/table$gt;
            $lt;b$gt;
                $lt;u$gt;blah blah blah$lt;/u$gt;
            $lt;/b$gt;
            $lt;br/$gt;
            $lt;table$gt;
                $lt;tr$gt;
                    $lt;td$gt;
                        $lt;br/$gt;blah blah blah$lt;/td$gt;
                    $lt;td$gt;blah blah blah$lt;br/$gt;Other:$lt;/td$gt;
                    $lt;td$gt;blah blah blah$lt;br/$gt;
                    $lt;/td$gt;
                $lt;/tr$gt;
            $lt;/table$gt;
        </node4a_with_nested_xml>
    </node4>
</Report>

需要解释为:

<?xml version="1.0" encoding="windows-1252"?>
<Report>
    <node1>node1</node1>
    <node2>node2</node2>
    <node3>node3</node3>
    <node4>
        <node4a_with_nested_xml>
            Nestedxml text
            <br/>
                <b>
                    <u>blah blah blah</u>
                </b>
            <br/>
            <table>
                <tr>
                    <td>
                        <br/>blah blah blah<br/>
                    </td>
                </tr>
            </table>
            <b>
                <u>blah blah blah</u>
            </b>
            <br/>
            <table>
                <tr>
                    <td>
                        <br/>blah blah blah
                    </td>
                    <td>
                    blah blah blah<br/>Other:
                    </td>
                    <td>blah blah blah<br/>
                    </td>
                </tr>
            </table>
        </node4a_with_nested_xml>
    </node4>
</Report>

然后我可以从那里开始拉入子节点并用它们做事 例如:

<xsl:for-each select="Report">
    <xsl:for-each select="node4">
        <xsl:for-each select="node4a_with_nested_xml">
            <xsl:value-of select="."/>
            <xsl:for-each select="table">
                <fo:table>
                    <xsl:for-each select="tr">
                    <fo:table-row>
                        <xsl:for-each select="td">
                        <fo:table-cell>
                            <xsl:value-of select="."/>
                            <xsl:for-each select="br">
                                <fo:block/>
                            </xsl:for-each>
                        </fo:table-cell>
                        </xsl:for-each>
                    </fo:table-row>
                </xsl:for-each>
                </fo:table>
            </xsl:for-each>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>

【问题讨论】:

您的处理器支持哪个版本的 XSLT? 不幸的是v1.0 $lt; 不是转义 XML,应该是 &amp;lt; XPath 3 有 parse-xml-fragment 可以将带有 XML 标记的字符串解析为节点 这是在 XSLT 3.0 中的实现方式:xsltfiddle.liberty-development.net/pPJ8LUP(正如 Martin 所说,$lt; 不是转义 XML,因此是替换语句)。 【参考方案1】:

在 XSLT 1.0 中,您必须分两遍进行转换:首先,禁用 node4a_with_nested_xml 上的输出转义并将结果保存到文件;然后使用另一个 XSLT 样式表处理生成的文件。

这是假设您的处理器支持 disable-output-escaping 并且转义字符串包含格式正确的 XML。

【讨论】:

为了利益 - 有 v2 或 v3 方式吗? (正在使用的处理器即将更新对 v2/v3 的支持) 正如其他人已经说过的,将字符串解析为 XML 是 XSLT 3.0 的内置特性。一些 XSLT 2.0 处理器支持它作为扩展。

以上是关于XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点的主要内容,如果未能解决你的问题,请参考以下文章

在XSLT中输出内容带有CDATA的XML节点

XSLT:如何将 XML 节点转换为字符串

使用禁用输出转义转换 XML 混合节点

xml XSLT的转义,1.xslt

如何使用 XSLT 制作 xml 节点的子节点的精确副本?

XSLT如何仅对XML文档的字符串节点中的数值进行排序