使用XSLT将XML的一部分复制为HTML

时间:2015-11-16 11:04:46

标签: xslt

我使用XSL文档将XML格式化为HTML。 XML的一部分是HTML片段。例如:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="formatter.xsl"?>
<root>
    <some-node>text</some-node>
    <another-node>text</another-node>
    <html-container>
        <p>This is an HTML with <a href="http://www.google.com" target="_blank">links</a> and <i>other stuff</i>.</p>
        <p>And on and on it goes...</p>
    </html-container>
</root>

我的XSL对XML进行了大量操作,但<html-container>中的部分需要按原样复制到新的XML - 所有HTML节点和属性。

我尝试过使用此模板:

<xsl:template match="html-container/*">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

但是这只复制了子节点,没有其他后代:

<p>This is an HTML with links and other stuff.</p>
<p>And on and on it goes...</p>

我也尝试过:

<xsl:template match="html-container//*">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

然后将属性复制为文本:

<p>This is an HTML with <a>http://www.google.com_blanklinks</a> and <i>other stuff</i>.</p>
<p>And on and on it goes...</p>

显然我错过了一些东西。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

如果您使用的是xsl:apply-templates,那么您通常应该拥有与您选择的节点和属性相匹配的模板。您尝试过的匹配html-container//*的内容只匹配元素,但您也需要匹配属性。

<xsl:template match="html-container//*|html-container//@*">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

请注意,这与XSLT身份模板非常相似,如下所示:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

这会匹配html-container之外的元素,这可能会影响您当前的XSLT。

或者,如果html-container的后代需要按原样复制,不做任何更改,只需使用xsl:copy-of

<xsl:template match="html-container/*">
    <xsl:copy-of select="."/>
</xsl:template>