对于这种需求,我会明确建议使用XSLT
,因为它是一种XML转换
,而XSLT
是用来转换XML
内容的。
然后,我会使用一个样式表的模板,该模板旨在作为字符串格式使用,如下所示:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'>
<xsl:template match='/'>
<elements>
<xsl:apply-templates select="elements/element1" mode="%s"/>
<xsl:apply-templates select="elements/element2" mode="%s"/>
<xsl:apply-templates select="elements/element3" mode="%s"/>
<xsl:apply-templates select="elements/element4" mode="%s"/>
<xsl:apply-templates select="elements/element5" mode="%s"/>
</elements>
</xsl:template>
<xsl:template match='*' mode='normal'>
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match='*' mode='comment'>
<xsl:text disable-output-escaping="yes"><!--</xsl:text><xsl:copy-of select="."/>--<xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:template>
</xsl:stylesheet>
如您所见,有两种模式:
- 如果选择
normal
,它将简单地复制节点的内容
- 如果选择
comment
,它将注释其内容
因此,如果我们激活element1
,element3
和element5
,我们样式表的实际内容将为String.format(template, "normal", "comment", "normal", "comment", "normal")
在下面的代码片段中,我使用jcabi-xml,因为它非常易于使用,但您也可以自由选择其他库,因为XSLT
是标准,所以它仍然可以工作。
XML first = new XMLDocument(
"<elements>\n" +
" <element1 atribute=\"value\"/>\n" +
" <element2 atribute=\"value\"/>\n" +
" <element3 atribute=\"value\"/>\n" +
" <element4 atribute=\"value\"/>\n" +
" <element5 atribute=\"value\"/>\n" +
"</elements>"
);
String template = "<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='2.0'>\n" +
" <xsl:template match='/'>\n" +
" <elements>\n" +
" <xsl:apply-templates select=\"elements/element1\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element2\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element3\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element4\" mode=\"%s\"/>\n" +
" <xsl:apply-templates select=\"elements/element5\" mode=\"%s\"/>\n" +
" </elements>\n" +
" </xsl:template>\n" +
" <xsl:template match='*' mode='normal'>\n" +
" <xsl:copy-of select=\".\"/>\n" +
" </xsl:template>\n" +
" <xsl:template match='*' mode='comment'>\n" +
" <xsl:text disable-output-escaping=\"yes\"><!--</xsl:text><xsl:copy-of select=\".\"/>--<xsl:text disable-output-escaping=\"yes\">></xsl:text>\n" +
" </xsl:template>\n" +
"</xsl:stylesheet>";
XML second = new XSLDocument(
String.format(template, "normal", "comment", "normal", "comment", "normal")
).transform(first);
System.out.println(second.toString());
输出:
<?xml version="1.0" encoding="UTF-8"?>
<elements>
<element1 atribute="value"/>
<!
<element3 atribute="value"/>
<!
<element5 atribute="value"/>
</elements>
NB:为了易读性,我格式化了输出
请注意:上述内容提醒读者为了易读性进行了格式化处理。