我使用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>
显然我错过了一些东西。任何帮助表示赞赏!
答案 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>