我正在使用XSLT1.0将一些XML转换为另一种XML。只需要对内容进行一些处理。
输入XML有一些注释,它们是扩展的charater实体形式。我需要它让它像常规评论一样。
输入如下,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept id="test">
<title>Test title</title>
<conbody><!-- test comments-->
<p>test paragraph <!-- comments in p --></p>
</conbody>
</concept>
所需的输出评论应如下所示,
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept id="test">
<title>Test title</title>
<conbody><!-- test comments-->
<p>test paragraph <!-- comments in p --></p>
</conbody>
</concept>
评论实际上应该如上所述。但我不确定是否可以在XSLT中执行此操作。
有人可以为此提供帮助吗?
答案 0 :(得分:0)
- 针对说明进行了编辑 -
也许它可以像这样简单:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()">
<xsl:value-of select="." disable-output-escaping="yes"/>
</xsl:template>
</xsl:stylesheet>
这假设您的处理链支持DOE。
它还假设您的XML不带有不应转义的其他转义标记。如果这不是一个安全的假设,那么使用:
<xsl:template match="text()" name="unescape-comments">
<xsl:param name="text" select="."/>
<xsl:choose>
<xsl:when test="contains($text, '<!--')">
<xsl:value-of select="substring-before($text, '<!--')"/>
<xsl:comment>
<xsl:value-of select="substring-before(substring-after($text, '<!--'), '-->')"/>
</xsl:comment>
<xsl:call-template name="unescape-comments">
<xsl:with-param name="text" select="substring-after($text, '-->')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>